用工小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
12 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
6 days ago
6 days ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
16 hours ago
10 months ago
10 months ago
10 months ago
  1. <template>
  2. <view class="se-p-40 se-bgc-f5">
  3. <view class="se-flex se-flex-v-sa se-flex-ai-fs se-py-20 se-px-30 se-bs se-bgc-white se-br-20">
  4. <view class="se-flex">
  5. <view class="se-w-160 se-h-160">
  6. <image class="se-w-160 se-h-160 se-br-10" :src="detail.employJob.image || detail.jobHeadImg" mode="">
  7. </image>
  8. </view>
  9. <view class="se-ml-20 se-flex se-flex-v-sa se-flex-ai-fs">
  10. <view class="se-fw-6 se-c-black se-fs-30 se-display-ib">{{ detail.title }}</view>
  11. <view class="se-fs-24 se-c-text-third se-display-ib">所属行业:{{ detail.categoryOne }}</view>
  12. <view class="se-fs-24 se-c-text-third se-display-ib">所属工种:{{ detail.categoryTwo }}</view>
  13. <!-- <view class="se-fs-24 se-c-text-third se-display-ib">工作时间:3h</view> -->
  14. </view>
  15. </view>
  16. </view>
  17. <view class="se-flex se-flex-h-fs se-mt-30 se-py-20 se-px-30 se-bs se-bgc-white se-br-20">
  18. <image class="se-a-30" src="@/static/image/46502.png" mode=""></image>
  19. <text class="se-c-black se-fs-32 se-ml-20">{{ detail.employResume ? detail.employResume.name : detail.workUser }}</text>
  20. <text class="se-c-black se-fs-32 se-ml-20">{{ detail.employResume ? detail.employResume.phone : detail.workPhone }}</text>
  21. </view>
  22. <view class="se-mt-30 se-py-20 se-px-30 se-bs se-bgc-white se-br-20">
  23. <view class="se-flex se-flex-h-sb se-pb-20 se-b-b">
  24. <view class="se-flex se-flex-h-fs">
  25. <image class="se-w-30 se-h-40" src="@/static/image/47961.png" mode=""></image>
  26. <text class="se-c-black se-fs-32 se-ml-20">{{ detail.employResume ? detail.employResume.name : detail.workUser }}</text>
  27. </view>
  28. <view>
  29. <text class="se-c-orange se-fs-32 se-ml-20">$ {{ detail.payMoney }}</text>
  30. </view>
  31. </view>
  32. <!-- 新增保险费明细 type==1 时显示 -->
  33. <template v-if="detail.type == 1">
  34. <!-- <view class="se-flex se-flex-h-sb se-pt-20">
  35. <view class="se-flex se-flex-h-fs">
  36. <u-checkbox v-model="insuranceChecked" @change="onInsuranceChange" activeColor="#ff7a31" shape="circle" size="16"></u-checkbox>
  37. <image class="se-w-30 se-h-40 se-ml-10" src="@/static/image/46524.png" mode=""></image>
  38. <text class="se-c-black se-fs-32 se-ml-20">保险费</text>
  39. </view>
  40. <view>
  41. <text class="se-c-orange se-fs-32 se-ml-20">{{ insuranceChecked ? detail.premium : 0 }}</text>
  42. </view>
  43. </view> -->
  44. <view class="se-flex se-flex-h-sb se-pt-20"
  45. v-if="detail.employSeek">
  46. <view class="se-flex se-flex-h-fs">
  47. <image class="se-w-30 se-h-40" src="@/static/image/47961.png" mode=""></image>
  48. <text class="se-c-black se-fs-32 se-ml-20">师傅试工交通费用</text>
  49. </view>
  50. <view class="se-flex se-flex-ai-c">
  51. <view class="se-bgc-orange se-display-ib se-br-10 se-py-5 se-px-20 se-c-white se-fs-20">
  52. {{ detail.employSeek.selectGo }}
  53. </view>
  54. <text class="se-c-orange se-fs-32 se-ml-20">$ {{ fare }}</text>
  55. </view>
  56. </view>
  57. <view class="se-c-black se-p-20 se-fs-24 se-flex se-flex-ai-c se-mt-20"
  58. style="background-color:rgba(255,164,113,0.48);">
  59. <view class="se-w-10 se-h-10 se-br-5 se-bgc-orange se-mr-10"></view>
  60. <text>全程共</text>
  61. <text class="se-c-orange se-px-5 se-fw-6">{{ distance }}</text>
  62. <text>公里</text>
  63. </view>
  64. <view class="se-p-20 se-fs-24 se-flex se-flex-ai-c" style="background-color:rgba(255,164,113,0.18);">
  65. 从师傅出发地到用工目的地总全程为5公里{{ distance }}公里x{{ farePerKm }}={{ fare }}
  66. </view>
  67. <view class="se-fs-22 se-lh-50 se-flex se-flex-v se-mt-10">
  68. <text>1.公交/地铁出行费用每公里{{ trafficPrice.bus }}</text>
  69. <text>2.出租车出行费用每公里{{ trafficPrice.taxi }}</text>
  70. <text>3.网约车出行费用每公里{{ trafficPrice.online }}</text>
  71. </view>
  72. </template>
  73. </view>
  74. <view class="se-mt-30 se-py-30 se-px-30 se-bs se-bgc-white se-br-20">
  75. <u-radio-group size="18" v-model="payRadio" iconPlacement="right">
  76. <view class="se-flex-v-sb se-w-p-100" style="align-items: unset;">
  77. <u-radio name="1" activeColor="#ff7a31">
  78. <view class="se-flex se-flex-ai-c se-pb-20">
  79. <image class="se-w-30 se-h-25 se-mt-5" src="@/static/image/46518.png" mode=""></image>
  80. <text class="se-c-black se-fs-30 se-ml-15">账户余额</text>
  81. <text class="se-c-text-third se-fs-28 se-ml-15">(余额{{ amount }})</text>
  82. </view>
  83. </u-radio>
  84. <u-radio name="2" activeColor="#ff7a31">
  85. <view class="se-flex se-flex-ai-c se-pt-20">
  86. <image class="se-w-35 se-h-30 se-mt-5" src="@/static/image/46662.png" mode=""></image>
  87. <text class="se-c-black se-fs-30 se-ml-15">微信支付</text>
  88. </view>
  89. </u-radio>
  90. </view>
  91. </u-radio-group>
  92. </view>
  93. <view class="se-mt-10 se-py-10 se-br-20 se-mb-160"
  94. style="display: flex;flex-direction: column;align-items: center;">
  95. <text class="se-c-66 se-fs-22">温馨提示下单前请仔细查看下单需知</text>
  96. <view class="se-flex-h-fs se-br-40 se-mt-20 se-flex-ai-fs se-h-80 se-lh-80 se-ta-c se-fs-24 se-c-33"
  97. style="align-items: unset;">
  98. <u-checkbox :checked="checked" activeColor="#ff7a31" label-size="12" shape="circle"
  99. label="阅读并同意"></u-checkbox>
  100. <text class="se-c-orange" @click="show=true">用户使用协议</text>
  101. </view>
  102. </view>
  103. <view class="se-pos-fixed se-pos-lb se-bs-t se-flex se-flex-h-sb se-pb-60 se-pt-20 se-bgc-white se-w-vw-100">
  104. <view class="se-fs-32 se-c-black se-ml-30">
  105. <text class="se-fs-24">合计</text>
  106. <text class="se-c-orange">{{price}}</text>
  107. </view>
  108. <view @click="payOrderCompany"
  109. class="se-mr-30 se-w-240 se-h-80 se-lh-80 se-ta-c se-c-white se-fs-32 se-br-40 se-bgc-orange">
  110. 立即支付
  111. </view>
  112. </view>
  113. <!-- 免责声明组件 -->
  114. <disclaimer-modal ref="disclaimerModal" @cancel="onDisclaimerCancel" @confirm="onDisclaimerConfirm"></disclaimer-modal>
  115. </view>
  116. </template>
  117. <script>
  118. import {
  119. orderDetail,
  120. deleteOrder,
  121. confirmOrder,
  122. payOrderCompany,
  123. userInfo,
  124. } from "@/common/api.js"
  125. import position from "@/utils/position.js"
  126. import DisclaimerModal from "@/components/disclaimer/index.vue"
  127. export default {
  128. components: {
  129. DisclaimerModal
  130. },
  131. data() {
  132. return {
  133. amount: 0,
  134. payRadio: "1",
  135. orderId : 0,
  136. checked : 0,
  137. detail : {},
  138. insuranceChecked: true, // 保险选择框,默认选中
  139. // type 0企业发布招聘,企业不需要支付保险、交通费,由个人承担
  140. // type 1个人发布求职,企业承担保险费、交通费用
  141. // 出行价格定义
  142. trafficPrice: {
  143. bus: 2, // 公交/地铁单价
  144. taxi: 3, // 出租车每公里单价
  145. online: 2.5 // 网约车每公里单价
  146. },
  147. fare : 0,//出行费
  148. distance : 0,//距离
  149. farePerKm : 2,//每公里单价
  150. }
  151. },
  152. computed : {
  153. price(){
  154. // type 0企业发布招聘,企业不需要支付保险、交通费,由个人承担
  155. // type 1个人发布求职,企业承担保险费、交通费用
  156. let basePrice = Number(this.detail.payMoney) || 0;
  157. let premiumFee = this.insuranceChecked ? (Number(this.detail.premium) || 0) : 0;
  158. let trafficFee = Number(this.fare) || 0;
  159. if (this.detail.type == 1) {
  160. // 个人发布求职,企业承担保险费、交通费用
  161. return basePrice + trafficFee
  162. } else {
  163. // 企业发布招聘,企业不需要支付保险、交通费,由个人承担
  164. return basePrice;
  165. }
  166. },
  167. },
  168. onLoad(options) {
  169. this.orderId = options.orderId
  170. },
  171. onShow() {
  172. this.onOrderDetail()
  173. this.onUserInfo()
  174. },
  175. methods: {
  176. onUserInfo(){
  177. let params={}
  178. userInfo(params).then(response=>{
  179. this.amount=response.result.amount?response.result.amount:0
  180. }).catch(error=>{
  181. })
  182. },
  183. onOrderDetail() {
  184. let that = this
  185. let params = {
  186. orderId: that.orderId
  187. }
  188. orderDetail(params).then(response => {
  189. that.detail = response.result
  190. that.calcDistance()
  191. that.calcFare()
  192. }).catch(error => {
  193. console.log(error)
  194. })
  195. },
  196. //计算距离
  197. calcDistance(){
  198. console.log('calcDistance-计算距离')
  199. let distance = 0;
  200. if (this.detail.type == 1) {
  201. let seek = this.detail.employSeek
  202. let company = this.detail.employAuthenticationCompany
  203. distance = position.calculateDistance(seek.latitude, seek.longitude, company.latitude, company.longitude)
  204. }
  205. this.distance = distance;
  206. },
  207. //计算路费
  208. calcFare(){
  209. console.log('calcFare-计算费用')
  210. let fare = 0;
  211. if (this.detail.type == 1) {
  212. // 个人发布求职,企业承担保险费、交通费用
  213. let seek = this.detail.employSeek
  214. if(!seek) return
  215. // console.log(this.$store.state.data.configList);
  216. let configList = this.$store.state.data.configList
  217. // if(seek.selectGo.includes('出租车')){
  218. // this.farePerKm = this.trafficPrice.taxi
  219. // }else if(seek.selectGo.includes('网约车')){
  220. // this.farePerKm = this.trafficPrice.online
  221. // }else if(seek.selectGo.includes('公交')){
  222. // this.farePerKm = this.trafficPrice.bus
  223. // }
  224. if(seek.selectGo.includes('出租车')){
  225. this.farePerKm = configList.taxi_price
  226. }else if(seek.selectGo.includes('网约车')){
  227. this.farePerKm = configList.online_price
  228. }else if(seek.selectGo.includes('公交')){
  229. this.farePerKm = configList.bus_price
  230. }
  231. fare = this.farePerKm * this.distance;
  232. }
  233. this.fare = fare;
  234. },
  235. onDetail() {
  236. uni.navigateTo({
  237. url: "/pages_subpack/order-detail/index"
  238. })
  239. },
  240. onInsuranceChange(value) {
  241. if (!value) {
  242. // 取消选中保险时,先恢复选中状态,然后显示免责声明
  243. this.insuranceChecked = true;
  244. this.$nextTick(() => {
  245. this.$refs.disclaimerModal.open();
  246. });
  247. }
  248. },
  249. onDisclaimerCancel() {
  250. // 取消免责声明,重新选中保险
  251. this.insuranceChecked = true;
  252. // 强制更新视图
  253. this.$forceUpdate();
  254. },
  255. onDisclaimerConfirm() {
  256. // 确认免责声明,保持不选中保险
  257. this.insuranceChecked = false;
  258. // 强制更新视图
  259. this.$forceUpdate();
  260. },
  261. payOrderCompany() {
  262. let that = this
  263. if(that.checked.length==0){
  264. return uni.showToast({
  265. icon: "none",
  266. title: "请勾选隐私协议"
  267. })
  268. }
  269. let data = {
  270. orderId: this.orderId,
  271. payType: this.payRadio,
  272. fare : this.fare || 0,//出行费
  273. buyInsurance: this.insuranceChecked // 新增参数,表示是否购买保险
  274. }
  275. payOrderCompany(data)
  276. .then(res => {
  277. if (res.code == 200) {
  278. if (data.payType == '2') {
  279. uni.requestPayment({
  280. provider: 'wxpay', // 服务提提供商
  281. timeStamp: res.result.timeStamp, // 时间戳
  282. nonceStr: res.result.nonceStr, // 随机字符串
  283. package: res.result.packageValue,
  284. signType: res.result.signType, // 签名算法
  285. paySign: res.result.paySign, // 签名
  286. success: function(res) {
  287. uni.navigateBack(-1)
  288. },
  289. fail: function(err) {
  290. uni.showToast({
  291. icon: 'none',
  292. title: "支付失败"
  293. })
  294. }
  295. });
  296. } else if (res.code == 200) {
  297. uni.navigateBack(-1)
  298. }
  299. }
  300. })
  301. },
  302. }
  303. }
  304. </script>
  305. <style>
  306. </style>