points.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. import { checkOut,calculateDiscount,ordersAndPrepay,currentUnlicensedPlate,unlicensedCarCheckIn,unlicensedCarCheckout } from '@/api/parking';
  2. import { setSelected } from './utils'
  3. export default {
  4. // 积分相关计算(仅计算用户可使用的积分)
  5. pointsRule( {commit,dispatch,state},checkOutResponse ) {
  6. const {discountInfo,parkingRule,parkInfo} = checkOutResponse
  7. const {
  8. points,
  9. usingTotalDiscount, // 当前车辆的已使用优惠的总上限
  10. } = discountInfo;
  11. const {
  12. parkMallCode
  13. } = parkInfo
  14. const {
  15. maxPointsTime = 0, // 最大积分
  16. enablePoints,
  17. availableDiscountFee,
  18. unLimitWeekendPoints = false,
  19. maxOneDayDiscountFee, // 每日最大优惠金额(深圳车场)
  20. remainConsumeTime, // 当前订单剩余可使用的优惠
  21. } = parkingRule;
  22. commit('setEnablePoints',enablePoints);
  23. if ( !points ) return commit('setIntegralDesc','暂无可用积分'); // 积分优惠处的描述
  24. const [
  25. {
  26. pointsPerHour,
  27. available, // 用户可用的积分(当前车辆在) available是用户选择抵扣N小时后剩余的可用积分
  28. maxDiscountFee, // 单次上限(元)
  29. unitAmount, // 兑换值(元)
  30. unlimitUsePoints= "LIMIT", // 前海积分最大上限
  31. unitHour, // 兑换值(小时)
  32. pointsPerUnit = 0, // 500积分对应的价值
  33. discountFee,
  34. label,
  35. },
  36. ] = points;
  37. commit('setAvailableDiscountFee',availableDiscountFee);
  38. dispatch('maxPointsTimeMath',checkOutResponse) // 剩余积分可兑换上限
  39. commit('setAvailable',available);
  40. commit('setMaxPointsTime',maxPointsTime);
  41. commit('setMaxDiscountFee',maxDiscountFee);
  42. let pointsTime = 0
  43. // 深圳
  44. if ( parkMallCode === 5 ) {
  45. pointsTime = discountFee || 0
  46. } else {
  47. pointsTime = discountFee ? discountFee / unitAmount: 0
  48. }
  49. commit('setPointsTime',pointsTime);
  50. commit('setPointsPerUnit',pointsPerUnit);
  51. commit('setMaxOneDayDiscountFee',maxOneDayDiscountFee);
  52. commit('setPointsPerHour',pointsPerUnit);
  53. commit('setUnitAmount',unitAmount);
  54. commit('setUnlimitUsePoints', unlimitUsePoints);
  55. commit('setUnLimitWeekendPoints', unLimitWeekendPoints);
  56. commit('setUnitHour', unitHour);
  57. commit('setIntegralDesc',pointsTime ? `已选择兑换${ pointsTime }${parkMallCode === 5 ? '元' : '小时'}` : available > pointsPerUnit ? `${ available }积分可减免` : `${ pointsPerUnit }积分可停车1小时`); // 积分优惠处的描述
  58. },
  59. // 当前最大可选优惠时间
  60. /*
  61. * 当前最大可选优惠时间
  62. * 1、不能超过积分上限
  63. * 2、
  64. * */
  65. maxPointsTimeMath( {commit,dispatch,state},checkOutResponse ) {
  66. const {discountInfo,parkingRule,parkInfo} = checkOutResponse
  67. const {
  68. points: [{
  69. available, // 用户可用的积分(当前车辆在) available是用户选择抵扣N小时后剩余的可用积分
  70. unitAmount, // 兑换值(元)
  71. pointsPerUnit = 0, // 500 积分对应的价值
  72. discountFee,
  73. maxDiscountFee,
  74. }]
  75. } = discountInfo
  76. const {
  77. parkMallCode
  78. } = parkInfo
  79. // 总积分
  80. const max = available / pointsPerUnit * unitAmount;
  81. const timeNum = maxDiscountFee / unitAmount;
  82. console.log(';999988888;',timeNum);
  83. /**
  84. * maxDiscountFee 单次最大可使用金额
  85. * availableDiscountFee 当日剩余可使用优惠金额
  86. * available 当前用户的剩余积分,也可以说是可以抵扣的积分,如果有积分抵扣自动勾选,那么这个值=这个值-已勾选积分
  87. *
  88. */
  89. // if ( !state.maxPointsTime ) {
  90. // commit('setMaxPointsTime', discountFee || max)
  91. // }
  92. // if (
  93. // parkInfo.parkMallCode === 3 &&
  94. // enablePoints && !maxPointsTime
  95. // ) {
  96. // return commit('setIntegralDesc', `今日已达上限`);
  97. // }
  98. // return commit('setIntegralDesc', `${available}积分可减免`);
  99. },
  100. // 积分减免
  101. pointsMath( {commit,dispatch,state},{type,callback} ) {
  102. const {parkInfo,parkingRule,parkingRecord} = state.orderDetail
  103. const {maxOneTimeDiscountTime,oneTimeLimitation,oneDayLimitation,hourPrice,remainConsumeTime, maxOneDayDiscountFee} = parkingRule
  104. const {parkMallCode} = parkInfo
  105. console.log(376,maxOneTimeDiscountTime,state.availableDiscountFee)
  106. /**
  107. * maxDiscountFee 单次最大可使用金额
  108. * availableDiscountFee 当日剩余可使用优惠金额
  109. * available 当前用户的剩余积分,也可以说是可以抵扣的积分,如果有积分抵扣自动勾选,那么这个值=这个值-已勾选积分
  110. */
  111. // 计算用户当前的最大可使用积分的总数(单位:元)
  112. let maxPointsTime = state.available / ( state.pointsPerUnit / state.unitAmount ) + state.pointsTime;
  113. if ( maxPointsTime > state.maxDiscountFee ) {
  114. maxPointsTime = state.maxDiscountFee
  115. }
  116. let msg = ''
  117. // 验证最大积分的总数(单位:元)
  118. if ( maxPointsTime > state.availableDiscountFee ) {
  119. maxPointsTime = state.availableDiscountFee
  120. }
  121. // if ( parkMallCode === 5 && state.unlimitUsePoints === 'LIMIT' ) {
  122. if ( parkMallCode === 5 && !state.unLimitWeekendPoints ) {
  123. if ( type === 'add' && (state.pointsTime >= maxPointsTime || state.usingTotalDiscount >= state.availableDiscountFee) ) {
  124. // 以下是深圳积分上限规则
  125. // 超出抵扣上限,每日最高可抵扣${this.parkFee.parkInfoEntity.maxOneDayHour}元 '优惠金额' >= '每日最高可抵扣'
  126. // if ( state.usingTotalDiscount >= state.availableDiscountFee && !msg ) {
  127. // msg = `超出抵扣上限,每日最高可抵扣${ state.maxOneDayDiscountFee }元`
  128. // }
  129. // 超出抵扣上限,每次最高可抵扣${this.integralMaxMoney}元 '积分兑换时长' >= '深圳前海停车积分上限'q
  130. if ( state.pointsTime >= state.maxDiscountFee && !msg ) {
  131. msg = `超出抵扣上限,每次最高可抵扣${ state.maxDiscountFee }元`
  132. }
  133. }
  134. }
  135. // 单日上限限制
  136. if ( oneDayLimitation && !msg && parkMallCode !== 5 && parkMallCode !== 4 && parkMallCode !== 6 && parkMallCode !== 2) {
  137. // const maxOneTimeDiscountFee = maxOneDayDiscountFee
  138. // const remainConsumeTimeFee = remainConsumeTime * hourPrice
  139. // 计算单日剩余 remainConsumeTime
  140. // 当前使用优惠 state.usingTotalDiscount
  141. // 判断符合上限
  142. // 浦东积分上限判断
  143. if ( parkMallCode === 1 && type === 'add' && state.usingTotalDiscount >= maxOneDayDiscountFee ) {
  144. msg = `超出抵扣上限,每次最高可抵扣${ maxOneDayDiscountFee }元`
  145. }
  146. }
  147. // 单次上限限制
  148. if ( oneTimeLimitation && !msg && parkMallCode !== 5 && parkMallCode !== 4&& parkMallCode !== 6 && parkMallCode !== 2) {
  149. const maxOneTimeDiscountFee = maxOneTimeDiscountTime * hourPrice // 计算时间对应的金额
  150. // const remainConsumeTimeFee = remainConsumeTime * hourPrice
  151. // 计算单日剩余 remainConsumeTime
  152. // 当前使用优惠 state.usingTotalDiscount
  153. // 判断符合上限
  154. // 浦东积分上限判断: 减去纸质优惠券的金额
  155. if ( parkMallCode === 1 && type === 'add' && state.usingTotalDiscount >= maxOneTimeDiscountFee ) {
  156. msg = `超出抵扣上限,每次最高可抵扣${ maxOneTimeDiscountTime }小时`
  157. }
  158. }
  159. if ( msg ) {
  160. callback({
  161. message: msg
  162. });
  163. return
  164. }
  165. // 计算浦东的上限
  166. // if ( type === 'add' && state.usingTotalDiscount >= state.availableDiscountFee && parkMallCode === 5 && state.unlimitUsePoints === 'LIMIT') {
  167. // if ( type === 'add' && state.usingTotalDiscount >= state.availableDiscountFee && parkMallCode === 5 && !state.unLimitWeekendPoints) {
  168. // return;
  169. // }
  170. // 如果天津的积分参与的抵扣金额大于等于当前车辆的总的停车费用,则阻止用户继续使用积分
  171. if(parkMallCode === 6 && state?.usingTotalDiscount>= parkingRecord?.totalFeeInYuan) {
  172. return
  173. }
  174. if ( type === 'add' ) {
  175. let pointsTime = 0;
  176. pointsTime = state.pointsTime + (parkMallCode === 5 ? state.unitAmount : state.unitHour);
  177. const available = state.available - state.pointsPerUnit;
  178. const usingTotalDiscount = state.usingTotalDiscount + (state?.unitHour ? state.unitHour * hourPrice : state.unitAmount); // 重新计算已经使用的优惠逻辑
  179. if ( available > -1 ) {
  180. // 如果是深圳车场
  181. commit('setAvailable',available);
  182. commit('setPointsTime',pointsTime);
  183. commit('setUsingTotalDiscount',usingTotalDiscount);
  184. }
  185. }
  186. if ( type === 'minus' && state.pointsTime > 0 ) {
  187. const pointsTime = state.pointsTime - (parkMallCode === 5 ? state.unitAmount : state.unitHour);
  188. const usingTotalDiscount = state.usingTotalDiscount - (state?.unitHour ? state.unitHour * hourPrice : state.unitAmount); // 重新计算已经使用的优惠逻辑
  189. // 如果是深圳车场
  190. commit('setAvailable',state.available + state.pointsPerUnit);
  191. commit('setPointsTime',pointsTime);
  192. commit('setUsingTotalDiscount',usingTotalDiscount);
  193. }
  194. },
  195. cancelPointsMath( {commit,dispatch,state},callback ) {
  196. const {
  197. discountInfo: {points},
  198. parkInfo: {parkMallCode},
  199. parkingRule,
  200. } = state.orderDetail;
  201. const [{pointsPerHour,available,discountFee, unitAmount}] = points;
  202. const {maxPointsTime,enablePoints} = parkingRule;
  203. if ( !points ) {
  204. callback && callback();
  205. return
  206. }
  207. let pointsTime = 0
  208. // 深圳
  209. if ( parkMallCode === 5 ) {
  210. pointsTime = discountFee || 0
  211. } else {
  212. pointsTime = discountFee ? discountFee / unitAmount : 0
  213. }
  214. commit('setAvailable',available);
  215. commit('setPointsTime',pointsTime || 0);
  216. callback && callback();
  217. },
  218. async savePointsMath( {commit,dispatch,state},callback ) {
  219. try {
  220. let orderDetail = {...state.orderDetail};
  221. const {parkInfo,parkingRule} = state.orderDetail
  222. const {maxOneTimeDiscountTime,oneTimeLimitation,oneDayLimitation,hourPrice,remainConsumeTime} = parkingRule
  223. const {parkMallCode} = parkInfo
  224. // 如果是重复提交,则不做重新计算
  225. if ( orderDetail.discountInfo.points[0].available === state.available ) {
  226. callback && callback();
  227. return
  228. }
  229. // 如果是会员等级减免\如果是消费减免\如果是纸质优惠券\电子券的话
  230. setSelected(['memberGrade','consume','paperCoupons','coupons'],orderDetail)
  231. // 计算积分修改之后的金额,返回给后端
  232. // orderDetail.discountInfo.points[0].discountFee = state.pointsTime * orderDetail.discountInfo.points[0].unitAmount;
  233. orderDetail.discountInfo.points[0].discountFee = parkMallCode === 5 ? state.pointsTime : state.pointsTime * orderDetail.discountInfo.points[0].unitAmount;
  234. orderDetail.discountInfo.points[0].available = state.available;
  235. orderDetail.discountInfo.points[0].selected = true;
  236. /* 其他优惠统计 */
  237. // 优惠券: 如果没有添加 selected 字段,则增加 selected; 默认取 defaultSelected;
  238. if ( orderDetail?.discountInfo?.hasOwnProperty('coupons') && !orderDetail?.discountInfo?.coupons[0]?.hasOwnProperty('selected') ) {
  239. orderDetail.discountInfo.coupons = orderDetail.discountInfo.coupons.map(elm => {
  240. elm.selected = elm.defaultSelected || false;
  241. return elm;
  242. })
  243. }
  244. const res = await calculateDiscount({
  245. ...orderDetail,
  246. });
  247. console.log('积分修改失败',{res});
  248. dispatch('orderInitRule',res);
  249. callback && callback();
  250. } catch ( err ) {
  251. console.log('积分修改失败!',err);
  252. callback && callback();
  253. }
  254. //
  255. },
  256. getIntegralDesc() {
  257. // 自动勾选积分优惠
  258. // 深圳是最大抵扣金额
  259. // available
  260. /*
  261. if (this.duration > 0) {
  262. // 深圳特殊处理(单位:金额)
  263. if (this.parkMallCode === 5) {
  264. return `已选择兑换${this.duration}元`;
  265. }
  266. return `已选择兑换${this.duration}小时`;
  267. }
  268. if (this.bonusCopy < this.integral) {
  269. return `${this.integral}积分可停车1小时`;
  270. }
  271. if (
  272. this.parkMallCode === 3 &&
  273. this.member?.currnentintegral >= this.integral &&
  274. !this.bonus
  275. ) {
  276. return `今日已达上限`;
  277. }
  278. return `${this.bonus}积分可减免`;
  279. */
  280. },
  281. }