billing.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. export default {
  2. data() {
  3. return {
  4. title: '收银台',
  5. type: 'goods',
  6. goodsData: {},
  7. orderData: {
  8. goods_num: 0,
  9. pay_money: 0,
  10. goods_list: [],
  11. remark: '',
  12. create_time: 0
  13. },
  14. remark: '',
  15. outTradeNo: '',
  16. orderId: 0,
  17. searchType: 'mobile',
  18. searchText: '',
  19. searchTypeList: [{
  20. 'label': '手机号',
  21. 'value': 'mobile',
  22. 'disabled': false
  23. },
  24. // {
  25. // 'label': '卡号',
  26. // 'value': 'member_code',
  27. // 'disabled': false
  28. // },
  29. {
  30. 'label': '昵称',
  31. 'value': 'nickname',
  32. 'disabled': false
  33. },
  34. ],
  35. date: '',
  36. goodsIds: [],
  37. ordertime: ''
  38. }
  39. },
  40. onShow() {
  41. this.orderData.create_time = this.$util.timeFormat(parseInt(new Date().getTime() / 1000));
  42. },
  43. onLoad() {
  44. },
  45. methods: {
  46. showMember() {
  47. this.type = 'member';
  48. this.$refs.member.type = 'member';
  49. },
  50. searchMember() {
  51. if (!this.searchText) {
  52. this.$util.showToast({
  53. title: '请输入会员信息',
  54. icon: 'error'
  55. });
  56. return false;
  57. }
  58. this.$refs.member.searchMemberByType(this.searchText, this.searchType);
  59. },
  60. switchType(index, item) {
  61. this.searchType = item.value;
  62. },
  63. addmember() {
  64. this.type = 'member';
  65. this.$refs.member.type = 'addmember';
  66. },
  67. /**
  68. * 切换会员
  69. */
  70. replaceMember() {
  71. this.$refs.member.memberId = 0;
  72. this.$store.commit('setMemberInfo', null);
  73. this.type = 'member';
  74. },
  75. selectGoods(data) {
  76. let key = 'sku_' + data.sku_id;
  77. if (this.goodsData[key]) {
  78. this.goodsData[key].num += 1;
  79. } else {
  80. this.goodsData[key] = data;
  81. this.goodsData[key].num = 1;
  82. }
  83. this.calculation();
  84. },
  85. selectMemberGoods(arr) {
  86. arr.forEach((data) => {
  87. let key = 'sku_' + data.sku_id + 'item_' + data.item_id;
  88. if (this.goodsData[key]) {
  89. this.goodsData[key].num += data.num;
  90. } else {
  91. this.goodsData[key] = data;
  92. this.goodsData[key].num = data.num;
  93. }
  94. })
  95. this.calculation();
  96. },
  97. deleteGoods(data) {
  98. if (data.card_item_id) {
  99. let _data = this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id];
  100. this.$refs.member.memberCardData.list[_data.card_index].total_use_num -= _data.num;
  101. this.$refs.member.memberCardData.list[_data.card_index].item_list[_data.index].use_num -= _data.num;
  102. if (this.$refs.member.memberCardData.index == _data.card_index) {
  103. if (_data.card_type != 'timecard') this.$refs.member.memberCardData.currData.item_list[_data.index]
  104. .use_num -= _data.num;
  105. this.$refs.member.memberCardData.currData.total_use_num -= _data.num;
  106. }
  107. delete this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id];
  108. } else {
  109. delete this.goodsData['sku_' + data.sku_id];
  110. }
  111. this.calculation();
  112. if (!Object.keys(this.goodsData).length) {
  113. this.orderData.goods_list = [];
  114. this.orderData.goods_num = 0;
  115. this.orderData.pay_money = 0;
  116. }
  117. },
  118. /**
  119. * 商品数量增加
  120. * @param {Object} data
  121. */
  122. inc(data) {
  123. if (data.card_item_id) {
  124. let _data = this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id],
  125. memberCardData = this.$refs.member.memberCardData;
  126. if (data.goods_type == '' && _data.num >= data.stock) {
  127. this.$util.showToast({
  128. title: '商品库存不足'
  129. });
  130. return;
  131. }
  132. // 如果会员卡项中正在变更的和该商品所使用的卡项一致
  133. if (memberCardData.index == _data.card_index && Object.keys(memberCardData.selected).length) return;
  134. if (_data.card_type == 'commoncard') {
  135. if (memberCardData.list[_data.card_index].total_num == memberCardData.list[_data.card_index]
  136. .total_use_num) return;
  137. } else if (_data.card_type != 'timecard') {
  138. if (memberCardData.list[_data.card_index].item_list[_data.index].num == memberCardData.list[_data
  139. .card_index].item_list[_data.index].use_num) return;
  140. }
  141. memberCardData.list[_data.card_index].total_use_num += 1;
  142. memberCardData.list[_data.card_index].item_list[_data.index].use_num += 1;
  143. if (memberCardData.index == _data.card_index) {
  144. memberCardData.currData.total_use_num += 1;
  145. if (_data.card_type != 'timecard') {
  146. memberCardData.currData.item_list[_data.index].use_num += 1;
  147. }
  148. }
  149. this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id].num += 1;
  150. } else {
  151. let _data = this.goodsData['sku_' + data.sku_id];
  152. if (data.goods_type == '' && _data.num >= data.stock) {
  153. this.$util.showToast({
  154. title: '商品库存不足'
  155. });
  156. return;
  157. }
  158. this.goodsData['sku_' + data.sku_id].num += 1;
  159. }
  160. this.calculation();
  161. },
  162. /**
  163. * 商品数量减少
  164. * @param {Object} data
  165. */
  166. dec(data) {
  167. if (data.card_item_id) {
  168. let _data = this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id];
  169. if (_data.num == 1) return;
  170. this.$refs.member.memberCardData.list[_data.card_index].total_use_num -= 1;
  171. this.$refs.member.memberCardData.list[_data.card_index].item_list[_data.index].use_num -= 1;
  172. if (this.$refs.member.memberCardData.index == _data.card_index) {
  173. this.$refs.member.memberCardData.currData.item_list[_data.index].use_num -= 1;
  174. this.$refs.member.memberCardData.currData.total_use_num -= 1;
  175. }
  176. this.goodsData['sku_' + data.sku_id + 'item_' + data.card_item_id].num -= 1;
  177. this.calculation();
  178. } else {
  179. if (this.goodsData['sku_' + data.sku_id].num == 1) return;
  180. this.goodsData['sku_' + data.sku_id].num -= 1;
  181. this.calculation();
  182. }
  183. },
  184. /**
  185. * 计算
  186. */
  187. calculation() {
  188. this.goodsIds = [];
  189. if (!Object.keys(this.goodsData).length) {
  190. this.orderData.goods_num = 0;
  191. return;
  192. }
  193. let sku_array = [],
  194. goodsIds = [];
  195. Object.keys(this.goodsData).forEach(key => {
  196. let item = this.goodsData[key];
  197. sku_array.push({
  198. sku_id: item.sku_id,
  199. num: item.num,
  200. card_item_id: item.item_id ? item.item_id : 0
  201. })
  202. if (!item.item_id) goodsIds.push(item.goods_id);
  203. })
  204. this.goodsIds = goodsIds;
  205. let data = {
  206. sku_array: JSON.stringify(sku_array),
  207. create_time: this.orderData.create_time
  208. };
  209. if (this.memberInfo) data.member_id = this.memberInfo.member_id;
  210. this.$api.sendRequest({
  211. url: '/cashier/storeapi/cashierordercreate/calculate',
  212. data: data,
  213. success: res => {
  214. if (res.code == 0) {
  215. Object.assign(this.orderData, res.data);
  216. uni.setStorageSync('orderData', this.orderData);
  217. this.$forceUpdate();
  218. } else {
  219. this.$util.showToast({
  220. title: res.message
  221. })
  222. }
  223. }
  224. })
  225. },
  226. /**
  227. * 返回
  228. */
  229. goreturn() {
  230. uni.navigateBack({
  231. delta: 1
  232. })
  233. },
  234. /**
  235. * 挂单
  236. */
  237. hangingOrder() {
  238. if (Object.keys(this.goodsData).length) {
  239. let data = {
  240. goods: [],
  241. order_id: this.orderData.order_id,
  242. remark: this.orderData.remark
  243. };
  244. if (this.memberInfo) data.member_id = this.memberInfo.member_id;
  245. Object.keys(this.goodsData).forEach(key => {
  246. let item = this.goodsData[key];
  247. data.goods.push({
  248. goods_id: item.goods_id,
  249. sku_id: item.sku_id,
  250. num: item.num
  251. })
  252. })
  253. data.goods = JSON.stringify(data.goods);
  254. this.$api.sendRequest({
  255. url: this.orderData.order_id ? '/cashier/storeapi/pendorder/edit' :
  256. '/cashier/storeapi/pendorder/add',
  257. data: data,
  258. success: res => {
  259. if (res.code == 0) {
  260. this.orderData.order_id = 0;
  261. this.wholeOrderCancel();
  262. this.$refs.order.orderData.page = 0;
  263. this.$refs.order.getOrder();
  264. } else {
  265. this.$util.showToast({
  266. title: res.message
  267. })
  268. }
  269. }
  270. })
  271. } else if (this.orderNum) {
  272. this.type = 'order';
  273. } else {
  274. this.$util.showToast({
  275. title: '当前没有挂单'
  276. })
  277. }
  278. },
  279. /**
  280. * 取单
  281. * @param {Object} data
  282. */
  283. takeorder(data) {
  284. this.$refs.member.memberId = data.member_id;
  285. if (data.member_id) {
  286. this.$refs.member.getMemberInfo();
  287. } else {
  288. this.$store.commit('setMemberInfo', null);
  289. }
  290. let goodsData = {};
  291. data.order_goods.forEach(item => {
  292. goodsData['sku_' + item.sku_id] = item;
  293. })
  294. this.goodsData = goodsData;
  295. this.orderData.order_id = data.order_id;
  296. this.orderData.goods_list = [];
  297. this.orderData.remark = data.remark;
  298. this.calculation();
  299. },
  300. /**
  301. * 整单取消
  302. */
  303. wholeOrderCancel() {
  304. if (Object.keys(this.goodsData).length) {
  305. // 清除当前会员
  306. this.$refs.member.memberId = 0;
  307. this.$refs.member.memberCardData.page = 0;
  308. this.$store.commit('setMemberInfo', null);
  309. // 清除商品数据
  310. this.goodsData = {};
  311. this.calculation();
  312. if (this.orderData.order_id) {
  313. this.$refs.order.deleteOrder(this.orderData);
  314. this.orderData.order_id = 0;
  315. }
  316. // 清除订单数据
  317. this.orderData = {
  318. goods_num: 0,
  319. pay_money: 0,
  320. goods_list: [],
  321. remark: '',
  322. create_time: this.$util.timeFormat(parseInt(new Date().getTime() / 1000))
  323. }
  324. this.outTradeNo = '';
  325. this.orderId = 0;
  326. } else {
  327. this.$util.showToast({
  328. title: '当前没有订单'
  329. })
  330. }
  331. },
  332. remarkConfirm() {
  333. this.orderData.remark = this.remark;
  334. this.$refs.remarkPopup.close();
  335. },
  336. remarkSeting() {
  337. this.remark = this.orderData.remark;
  338. this.$refs.remarkPopup.open();
  339. },
  340. /**
  341. * 支付
  342. */
  343. pay(type = '') {
  344. if (!Object.keys(this.goodsData).length || this.isRepeat) return;
  345. this.isRepeat = true;
  346. if (this.outTradeNo) {
  347. this.type = 'pay';
  348. if (type) this.$refs.payment.type = type;
  349. return;
  350. }
  351. let sku_array = [];
  352. Object.keys(this.goodsData).forEach(key => {
  353. let item = this.goodsData[key];
  354. sku_array.push({
  355. sku_id: item.sku_id,
  356. num: item.num,
  357. card_item_id: item.item_id ? item.item_id : 0
  358. })
  359. })
  360. let data = {
  361. sku_array: JSON.stringify(sku_array),
  362. remark: this.orderData.remark,
  363. create_time: this.orderData.create_time
  364. };
  365. if (this.memberInfo) data.member_id = this.memberInfo.member_id;
  366. this.$api.sendRequest({
  367. url: '/cashier/storeapi/cashierordercreate/create',
  368. data: data,
  369. success: res => {
  370. this.isRepeat = false;
  371. if (res.code == 0) {
  372. this.outTradeNo = res.data.out_trade_no;
  373. this.orderId = res.data.order_id;
  374. this.type = 'pay';
  375. if (type) this.$refs.payment.type = type;
  376. } else {
  377. this.$util.showToast({
  378. title: res.message,
  379. })
  380. }
  381. }
  382. })
  383. },
  384. cancelPayment() {
  385. this.$api.sendRequest({
  386. url: '/cashier/storeapi/cashierorder/deleteorder',
  387. data: {
  388. order_id: this.orderId
  389. },
  390. success: res => {
  391. if (res.code == 0) {
  392. this.outTradeNo = '';
  393. this.orderId = 0;
  394. this.type = 'goods';
  395. } else {
  396. this.$util.showToast({
  397. title: res.message,
  398. })
  399. }
  400. }
  401. })
  402. },
  403. paySuccess() {
  404. this.type = 'goods';
  405. this.wholeOrderCancel();
  406. this.searchText = '';
  407. }
  408. },
  409. computed: {
  410. orderNum() {
  411. return this.$store.state.pendOrderNum;
  412. }
  413. },
  414. watch: {
  415. type: function(nVal) {
  416. if (nVal != 'member') {
  417. this.$refs.member.search = false;
  418. }
  419. },
  420. orderNum: function(nVal) {
  421. if (nVal == 0) this.type = 'goods';
  422. },
  423. memberInfo: function(nVal, oVal) {
  424. if ((nVal && oVal && nVal.member_id != oVal.member_id) || !nVal) {
  425. this.goodsData = {};
  426. }
  427. this.calculation();
  428. }
  429. }
  430. }