activity.js 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var Controller = {
  3. data: () => {
  4. const { ElMessage } = ElementPlus
  5. return {
  6. activityData: [{
  7. type: 'promo',
  8. title: '营销',
  9. children: {
  10. full_coupon: {
  11. title: '优惠券',
  12. subtitle: '向客户发送店铺优惠券',
  13. },
  14. /*full_reduce: {
  15. title: '满额立减',
  16. subtitle: '满足活动条件享受立减优惠',
  17. },
  18. full_discount: {
  19. title: '满额折扣',
  20. subtitle: '满足活动条件享受折扣优惠',
  21. },
  22. full_gift: {
  23. title: '满赠',
  24. subtitle: '吸引客流,刺激消费',
  25. },
  26. free_shipping: {
  27. title: '满额包邮',
  28. subtitle: '满足活动条件享受包邮优惠',
  29. },*/
  30. },
  31. },
  32. {
  33. type: 'activity',
  34. title: '活动',
  35. children: {
  36. groupon: {
  37. title: '普通拼团',
  38. subtitle: '多人拼团享优惠',
  39. },
  40. /*groupon_ladder: {
  41. title: '阶梯拼团',
  42. subtitle: '人数越多价格越优惠',
  43. },*/
  44. seckill: {
  45. title: '秒杀',
  46. subtitle: '限时特卖引流涨粉',
  47. },
  48. kan: {
  49. title: '砍价',
  50. subtitle: '多人砍价引流涨粉',
  51. },
  52. },
  53. },
  54. /*{
  55. type: 'app',
  56. title: '应用',
  57. children: {
  58. score_shop: {
  59. title: '积分商城',
  60. subtitle: '引导客户积分消费有效促活',
  61. },
  62. signin: {
  63. title: '签到',
  64. subtitle: '签到享好礼,客户更活跃',
  65. },
  66. wechat_mplive: {
  67. title: '微信小程序直播',
  68. subtitle: '一键同步直播间,管理直播间',
  69. },
  70. },
  71. }*/
  72. ],
  73. getForm: (type) => {
  74. let form = {
  75. model: {
  76. title: '',
  77. type: type,
  78. dateTime: [],
  79. start_time: '',
  80. end_time: '',
  81. richtext_id: '',
  82. richtext_title: '',
  83. },
  84. rules: {
  85. title: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
  86. dateTime: [{ required: true, message: '请选择活动时间', trigger: 'blur' }],
  87. start_time: [{ required: true, message: '请选择活动开始时间', trigger: 'blur' }],
  88. end_time: [{ required: true, message: '请选择活动结束时间', trigger: 'blur' }],
  89. prehead_time: [{ required: true, message: '请选择预热时间', trigger: 'blur' }],
  90. goods_list: [{ required: true, message: '请选择商品', trigger: 'blur' }],
  91. },
  92. };
  93. let tempForm = {
  94. full_reduce: {
  95. model: {
  96. rules: {
  97. type: 'money',
  98. discounts: [
  99. {
  100. full: '',
  101. discount: '',
  102. },
  103. ],
  104. },
  105. goods_ids: null,
  106. goods_list: [],
  107. },
  108. rules: {
  109. rules: {
  110. discounts: {
  111. full: [{ required: true, message: '请输入', trigger: 'blur' }],
  112. discount: [{ required: true, message: '请输入', trigger: 'blur' }],
  113. },
  114. }
  115. },
  116. },
  117. full_discount: {
  118. model: {
  119. rules: {
  120. type: 'money',
  121. discounts: [
  122. {
  123. full: '',
  124. discount: '',
  125. },
  126. ],
  127. },
  128. goods_ids: null,
  129. goods_list: [],
  130. },
  131. rules: {
  132. rules: {
  133. discounts: {
  134. full: [
  135. {
  136. required: true,
  137. message: '请输入',
  138. trigger: 'blur',
  139. },
  140. ],
  141. discount: [
  142. {
  143. required: true,
  144. message: '请输入',
  145. trigger: 'blur',
  146. },
  147. ],
  148. },
  149. }
  150. },
  151. },
  152. full_gift: {
  153. model: {
  154. rules: {
  155. limit_num: 0, // 参与次数 0=不限制
  156. type: 'money', // 优惠类型 money=满足金额 num=满足件数
  157. event: 'paid', // 赠送时机 paid=支付完成 confirm=确认收货 finish=交易完成
  158. discounts: [
  159. {
  160. full: '',
  161. gift_num: '', // 礼品份数
  162. types: [], // 赠送类型 coupon_ids=优惠券 score=积分 money=余额
  163. coupon_list: [], // 暂存数据
  164. coupon_ids: '',
  165. total: '',
  166. score: '',
  167. money: '',
  168. // goods_ids:"",
  169. },
  170. ],
  171. },
  172. goods_ids: null,
  173. goods_list: [],
  174. },
  175. rules: {
  176. rules: {
  177. discounts: {
  178. full: [
  179. {
  180. required: true,
  181. message: '请输入',
  182. trigger: 'blur',
  183. },
  184. ],
  185. gift_num: [
  186. {
  187. required: true,
  188. message: '请输入',
  189. trigger: 'blur',
  190. },
  191. ],
  192. types: [
  193. {
  194. required: true,
  195. message: '请选择赠送类型',
  196. trigger: 'blur',
  197. },
  198. ],
  199. },
  200. }
  201. },
  202. },
  203. free_shipping: {
  204. model: {
  205. rules: {
  206. type: 'money',
  207. full_num: '',
  208. province_except: '', // 区
  209. city_except: '', // 市
  210. district_except: '', // 街道
  211. district_text: {}, // label数据
  212. },
  213. goods_ids: null,
  214. goods_list: [],
  215. },
  216. rules: {
  217. rules: {
  218. full_num: { required: true, message: '请输入', trigger: 'blur' },
  219. }
  220. },
  221. },
  222. groupon: {
  223. model: {
  224. prehead_time: '',
  225. rules: {
  226. is_commission: 0, // 是否参与分销
  227. is_free_shipping: 0, // 是否包邮
  228. sales_show_type: 'real', // real=真实活动销量|goods=商品总销量(包含虚拟销量)
  229. team_num: 2, // 成团人数,最少两人
  230. is_alone: 0, // 是否允许单独购买
  231. is_fictitious: 0, // 是否允许虚拟成团
  232. fictitious_num: 0, // 最多虚拟人数 0:不允许虚拟 '' 不限制
  233. fictitious_time: 0, // 开团多长时间自动虚拟成团
  234. is_team_card: 0, // 参团卡显示
  235. is_leader_discount: 0, // 团长优惠
  236. valid_time: 24, // 组团有效时间, 0:一直有效
  237. limit_num: 0, // 每人限购数量 0:不限购
  238. refund_type: 'back', // 退款方式 back=原路退回|money=退回到余额
  239. order_auto_close: 5, // 订单自动关闭时间,如果为 0 将使用系统级订单自动关闭时间
  240. },
  241. goods_ids: null,
  242. goods_list: [],
  243. },
  244. rules: {
  245. rules: {
  246. valid_time: [{ required: true, message: '请输入拼团解散时间', trigger: 'blur' }],
  247. team_num: [{ required: true, message: '请输入成团人数', trigger: 'blur' }],
  248. fictitious_num: [{ required: true, message: '请输入最多虚拟人数', trigger: 'blur' }],
  249. fictitious_time: [{ required: true, message: '请输入虚拟成团时间', trigger: 'blur' }],
  250. order_auto_close: [
  251. { required: true, message: '请输入订单支付时间', trigger: 'blur' },
  252. {
  253. validator: (rule, value, callback) => {
  254. if (Number(value) <= 0) {
  255. callback(new Error('值必须大于0'));
  256. } else {
  257. callback();
  258. }
  259. },
  260. trigger: 'blur',
  261. },
  262. ],
  263. }
  264. },
  265. },
  266. groupon_ladder: {
  267. model: {
  268. prehead_time: '',
  269. rules: {
  270. is_commission: 0, // 是否参与分销
  271. is_free_shipping: 0, // 是否包邮
  272. sales_show_type: 'real', // real=真实活动销量|goods=商品总销量(包含虚拟销量)
  273. ladders: {
  274. ladder_one: 2,
  275. ladder_two: 3,
  276. }, // {ladder_one:2,ladder_two:2,ladder_three:2}
  277. is_alone: 0, // 是否允许单独购买
  278. is_fictitious: 0, // 是否允许虚拟成团
  279. fictitious_num: 0, // 最多虚拟人数 0:不允许虚拟 '' 不限制
  280. fictitious_time: 0, // 开团多长时间自动虚拟成团
  281. is_team_card: 0, // 参团卡显示
  282. is_leader_discount: 0, // 团长优惠
  283. valid_time: 24, // 组团有效时间, 0:一直有效
  284. limit_num: 0, // 每人限购数量 0:不限购
  285. refund_type: 'back', // 退款方式 back=原路退回|money=退回到余额
  286. order_auto_close: 5, // 订单自动关闭时间,如果为 0 将使用系统级订单自动关闭时间
  287. },
  288. goods_ids: null,
  289. goods_list: [],
  290. },
  291. rules: {
  292. rules: {
  293. valid_time: [{ required: true, message: '请输入拼团解散时间', trigger: 'blur' }],
  294. ladder_one: [{ required: true, message: '最少两人', trigger: 'blur' }],
  295. ladder_two: [{ required: true, message: '最少两人', trigger: 'blur' }],
  296. ladder_three: [{ required: true, message: '最少两人', trigger: 'blur' }],
  297. fictitious_num: [{ required: true, message: '请输入最多虚拟人数', trigger: 'blur' }],
  298. fictitious_time: [{ required: true, message: '请输入虚拟成团时间', trigger: 'blur' }],
  299. order_auto_close: [
  300. { required: true, message: '请输入订单支付时间', trigger: 'blur' },
  301. {
  302. validator: (rule, value, callback) => {
  303. if (Number(value) <= 0) {
  304. callback(new Error('值必须大于0'));
  305. } else {
  306. callback();
  307. }
  308. },
  309. trigger: 'blur',
  310. },
  311. ],
  312. }
  313. },
  314. },
  315. seckill: {
  316. model: {
  317. prehead_time: '',
  318. rules: {
  319. is_commission: 0, // 是否参与分销
  320. is_free_shipping: 0, // 是否包邮
  321. sales_show_type: 'real', // real=真实活动销量|goods=商品总销量(包含虚拟销量)
  322. limit_num: 0, // 每人限购数量 0:不限购
  323. order_auto_close: 5, // 订单自动关闭时间,如果为 0 将使用系统级订单自动关闭时间is_commission: 0, // 是否参与分销
  324. },
  325. goods_ids: null,
  326. goods_list: [],
  327. },
  328. rules: {
  329. rules: {
  330. order_auto_close: [
  331. { required: true, message: '请输入订单支付时间', trigger: 'blur' },
  332. {
  333. validator: (rule, value, callback) => {
  334. if (Number(value) <= 0) {
  335. callback(new Error('值必须大于0'));
  336. } else {
  337. callback();
  338. }
  339. },
  340. trigger: 'blur',
  341. },
  342. ],
  343. }
  344. },
  345. },
  346. kan: {
  347. model: {
  348. prehead_time: '',
  349. rules: {
  350. is_commission: 0, // 是否参与分销
  351. is_free_shipping: 0, // 是否包邮
  352. sales_show_type: 'real', // real=真实活动销量|goods=商品总销量(包含虚拟销量)
  353. limit_num: 0, // 每人限购数量 0:不限购
  354. order_auto_close: 5, // 订单自动关闭时间,如果为 0 将使用系统级订单自动关闭时间is_commission: 0, // 是否参与分销
  355. team_num: 2, // 最多砍价人数
  356. },
  357. goods_ids: null,
  358. goods_list: [],
  359. },
  360. rules: {
  361. rules: {
  362. team_num: [
  363. { required: true, message: '请输入成团人数', trigger: 'blur' },
  364. {
  365. validator: (rule, value, callback) => {
  366. if (Number(value) <= 0) {
  367. callback(new Error('值必须大于0'));
  368. } else {
  369. callback();
  370. }
  371. },
  372. trigger: 'blur',
  373. },
  374. ],
  375. limit_num: [
  376. { required: true, message: '请输入限购数量', trigger: 'blur' },
  377. {
  378. validator: (rule, value, callback) => {
  379. if (Number(value) <= 0) {
  380. callback(new Error('值必须大于0'));
  381. } else {
  382. callback();
  383. }
  384. },
  385. trigger: 'blur',
  386. },
  387. ],
  388. order_auto_close: [
  389. { required: true, message: '请输入订单支付时间', trigger: 'blur' },
  390. {
  391. validator: (rule, value, callback) => {
  392. if (Number(value) <= 0) {
  393. callback(new Error('值必须大于0'));
  394. } else {
  395. callback();
  396. }
  397. },
  398. trigger: 'blur',
  399. },
  400. ],
  401. }
  402. },
  403. },
  404. signin: {
  405. model: {
  406. rules: {
  407. everyday: 0, // 每日签到固定积分
  408. is_inc: 0, // 是否递增签到
  409. inc_num: 0, // 递增奖励
  410. until_day: 0, // 递增持续天数
  411. discounts: [], // 连续签到奖励 {full:5, value:10}
  412. is_replenish: 0, // 是否开启补签
  413. replenish_days: 1, // 可补签天数 最小1
  414. replenish_limit: 0, // 补签事件限制,0 不限制
  415. replenish_num: 1, // 补签所消耗积分
  416. },
  417. },
  418. rules: {
  419. rules: {
  420. everyday: [{ required: true, message: '请输入日签奖励', trigger: 'blur' }],
  421. inc_num: [{ required: true, message: '请输入', trigger: 'blur' }],
  422. until_day: [{ required: true, message: '请输入', trigger: 'blur' }],
  423. discounts: {
  424. full: [{ required: true, message: '请输入', trigger: 'blur' }],
  425. value: [{ required: true, message: '请输入', trigger: 'blur' }],
  426. },
  427. replenish_days: [{ required: true, message: '请输入最多虚拟人数', trigger: 'blur' }],
  428. replenish_limit: [{ required: true, message: '请输入虚拟成团时间', trigger: 'blur' }],
  429. replenish_num: [{ required: true, message: '请输入虚拟成团时间', trigger: 'blur' }],
  430. },
  431. },
  432. },
  433. };
  434. console.log(tempForm[type], type, 'kjkj')
  435. form.model = {
  436. ...form.model,
  437. ...tempForm[type].model,
  438. };
  439. form.rules = { ...form.rules, ...tempForm[type].rules };
  440. return form;
  441. },
  442. handleForm: (submitForm) => {
  443. if (submitForm.type != 'signin') {
  444. // 处理商品
  445. let goodsIds = [];
  446. submitForm.goods_list.forEach((g) => {
  447. goodsIds.push(g.id);
  448. });
  449. submitForm.goods_ids = goodsIds.join(',');
  450. }
  451. // 满减
  452. if (submitForm.type == 'full_reduce') {
  453. if (submitForm.rules.type == 'money') {
  454. let flag = true;
  455. submitForm.rules.discounts.forEach((d) => {
  456. if (Number(d.full) < Number(d.discount)) {
  457. flag = false;
  458. }
  459. });
  460. if (!flag) {
  461. ElMessage({
  462. message: '请输入正确的规则',
  463. type: 'warning',
  464. });
  465. return;
  466. }
  467. }
  468. }
  469. // 满赠
  470. if (submitForm.type == 'full_gift') {
  471. // 优惠券
  472. submitForm.rules.discounts.forEach((d) => {
  473. let couponIds = [];
  474. let total = 0;
  475. d.coupon_list.forEach((c) => {
  476. couponIds.push(c.id);
  477. total += Number(c.amount);
  478. });
  479. d.coupon_ids = couponIds.join(',');
  480. d.total = total;
  481. delete d.coupon_list;
  482. });
  483. }
  484. // 阶梯拼团
  485. if (submitForm.type == 'groupon_ladder') {
  486. if (
  487. !(
  488. (!submitForm.rules.ladders.hasOwnProperty('ladder_three') &&
  489. Number(submitForm.rules.ladders.ladder_one) <
  490. Number(submitForm.rules.ladders.ladder_two)) ||
  491. (submitForm.rules.ladders.hasOwnProperty('ladder_three') &&
  492. Number(submitForm.rules.ladders.ladder_one) <
  493. Number(submitForm.rules.ladders.ladder_two) &&
  494. Number(submitForm.rules.ladders.ladder_two) <
  495. Number(submitForm.rules.ladders.ladder_three))
  496. )
  497. ) {
  498. ElMessage({
  499. message: '请输入成团人数(阶梯人数依次增加)',
  500. type: 'warning',
  501. });
  502. return;
  503. }
  504. let flag = false;
  505. submitForm.goods_list.forEach((goods) => {
  506. if (goods.activity_sku_prices) {
  507. goods.activity_sku_prices.forEach((sku) => {
  508. if (sku.status == 'up' && submitForm.rules.ladders.hasOwnProperty('ladder_three')) {
  509. if (!(sku.hasOwnProperty('ladder_three') && sku.hasOwnProperty('ladder_three'))) {
  510. flag = true;
  511. }
  512. }
  513. });
  514. }
  515. });
  516. if (flag) {
  517. ElMessage({
  518. message: '请完善商品规格信息',
  519. type: 'warning',
  520. });
  521. return;
  522. }
  523. }
  524. submitForm.start_time = submitForm.dateTime[0];
  525. submitForm.end_time = submitForm.dateTime[1];
  526. delete submitForm.dateTime;
  527. return submitForm;
  528. }
  529. }
  530. },
  531. index: () => {
  532. const { activityData } = Controller.data()
  533. const { reactive, onMounted } = Vue
  534. const index = {
  535. setup() {
  536. function onActivity(key, title) {
  537. if (key == 'full_coupon') {
  538. Fast.api.addtabs(`shopro/coupon/index`, '优惠券')
  539. } else if (key == 'score_shop') {
  540. Fast.api.addtabs(`shopro/app/score_shop/index`, '积分商城')
  541. } else if (key == 'wechat_mplive') {
  542. Fast.api.addtabs(`shopro/app/mplive/index`, '小程序直播')
  543. } else {
  544. Fast.api.addtabs(`shopro/activity/activity/index?type=${key}&title=${title}`, title)
  545. }
  546. }
  547. const state = reactive({
  548. type: new URLSearchParams(location.search).get('type'),
  549. title: new URLSearchParams(location.search).get('title'),
  550. data: [],
  551. order: '',
  552. sort: '',
  553. filter: {
  554. drawer: false,
  555. data: {
  556. title: '',
  557. status: 'all',
  558. activity_time: [],
  559. },
  560. tools: {
  561. title: {
  562. type: 'tinput',
  563. label: '活动名称',
  564. placeholder: '请输入活动名称',
  565. value: '',
  566. },
  567. status: {
  568. type: 'tselect',
  569. label: '状态',
  570. value: '',
  571. options: {
  572. data: [{
  573. label: '全部',
  574. value: 'all',
  575. },
  576. {
  577. label: '未开始',
  578. value: 'nostart',
  579. },
  580. {
  581. label: '进行中',
  582. value: 'ing',
  583. },
  584. {
  585. label: '已结束',
  586. value: 'ended',
  587. }],
  588. },
  589. },
  590. activity_time: {
  591. type: 'tdatetimerange',
  592. label: '时间',
  593. value: [],
  594. },
  595. },
  596. condition: {},
  597. },
  598. statusStyle: {
  599. nostart: 'sa-color--info',
  600. ing: 'sa-color--success',
  601. ended: 'sa-color--danger',
  602. }
  603. })
  604. function getData() {
  605. let tempSearch = JSON.parse(JSON.stringify(state.filter.data));
  606. let search = composeFilter(tempSearch, {
  607. title: 'like',
  608. activity_time: 'range',
  609. });
  610. Fast.api.ajax({
  611. url: 'shopro/activity/activity',
  612. type: 'GET',
  613. data: {
  614. type: state.type,
  615. page: pagination.page,
  616. list_rows: pagination.list_rows,
  617. order: state.order,
  618. sort: state.sort,
  619. ...search,
  620. },
  621. }, function (ret, res) {
  622. state.data = res.data.data
  623. pagination.total = res.data.total
  624. return false
  625. }, function (ret, res) { })
  626. }
  627. function onChangeSort({ prop, order }) {
  628. state.order = order == 'ascending' ? 'asc' : 'desc';
  629. state.sort = prop;
  630. getData();
  631. }
  632. function onOpenFilter() {
  633. state.filter.drawer = true
  634. }
  635. function onChangeFilter() {
  636. pagination.page = 1
  637. getData()
  638. state.filter.drawer && (state.filter.drawer = false)
  639. }
  640. const pagination = reactive({
  641. page: 1,
  642. list_rows: 10,
  643. total: 0,
  644. })
  645. function onAdd() {
  646. Fast.api.open(`shopro/activity/activity/add?type=add&activity_type=${state.type}`, "添加", {
  647. callback() {
  648. getData()
  649. }
  650. })
  651. }
  652. function onEdit(id) {
  653. Fast.api.open(`shopro/activity/activity/edit?type=edit&activity_type=${state.type}&id=${id}`, "编辑", {
  654. callback() {
  655. getData()
  656. }
  657. })
  658. }
  659. function onDelete(id) {
  660. Fast.api.ajax({
  661. url: `shopro/activity/activity/delete/id/${id}`,
  662. type: 'DELETE',
  663. }, function (ret, res) {
  664. getData()
  665. }, function (ret, res) { })
  666. }
  667. function onRecyclebin() {
  668. Fast.api.open(`shopro/activity/activity/recyclebin?activity_type=${state.type}`, "回收站", {
  669. callback() {
  670. getData()
  671. }
  672. })
  673. }
  674. function onGroupon(id) {
  675. Fast.api.addtabs(`shopro/activity/groupon/index?activity_id=${id}`, "拼团列表", {
  676. callback() {
  677. getData()
  678. }
  679. })
  680. }
  681. onMounted(() => {
  682. getData()
  683. })
  684. return {
  685. activityData,
  686. onActivity,
  687. state,
  688. getData,
  689. onChangeSort,
  690. onOpenFilter,
  691. onChangeFilter,
  692. pagination,
  693. onAdd,
  694. onEdit,
  695. onDelete,
  696. onRecyclebin,
  697. onGroupon
  698. }
  699. }
  700. }
  701. createApp('index', index);
  702. },
  703. add: () => {
  704. Controller.form();
  705. },
  706. edit: () => {
  707. Controller.form();
  708. },
  709. form: () => {
  710. const { getForm, handleForm } = Controller.data()
  711. const { reactive, computed, onMounted, getCurrentInstance } = Vue
  712. const addEdit = {
  713. setup() {
  714. const { proxy } = getCurrentInstance();
  715. const state = reactive({
  716. type: new URLSearchParams(location.search).get('type'),
  717. id: new URLSearchParams(location.search).get('id'),
  718. activity_type: new URLSearchParams(location.search).get('activity_type'),
  719. activityStatus: 0,
  720. limitNumType: 'all',
  721. is_discounts: '0',
  722. goodsType: 'all',
  723. })
  724. const isActivity = computed(
  725. () =>
  726. state.activity_type == 'groupon' ||
  727. state.activity_type == 'kan' ||
  728. state.activity_type == 'groupon_ladder' ||
  729. state.activity_type == 'seckill',
  730. );
  731. const form = reactive(getForm(state.activity_type))
  732. function getDetail() {
  733. Fast.api.ajax({
  734. url: `shopro/activity/activity/detail/id/${state.id}`,
  735. type: 'GET',
  736. }, function (ret, res) {
  737. form.model = res.data;
  738. // 处理时间
  739. form.model.dateTime = [form.model.start_time, form.model.end_time];
  740. // 处理商品
  741. if (form.model.goods_ids) {
  742. state.goodsType = 'part';
  743. }
  744. if (form.model.rules.limit_num) {
  745. state.limitNumType = 'part'
  746. }
  747. if (state.activity_type == 'signin') {
  748. state.is_discounts = form.model.rules.discounts.length > 0 ? '1' : '0'
  749. }
  750. state.activityStatus = res.data.status == 'ing' ? 1 : 0;
  751. return false
  752. }, function (ret, res) { })
  753. }
  754. function onChangeEndtime(val) {
  755. form.model.dateTime[1] = val
  756. }
  757. function onAddDiscounts() {
  758. if (form.model.type == 'full_reduce' || form.model.type == 'full_discount') {
  759. form.model.rules.discounts.push({
  760. full: '',
  761. discount: '',
  762. })
  763. } else if (form.model.type == 'full_gift') {
  764. form.model.rules.discounts.push({
  765. full: '',
  766. gift_num: '',
  767. types: [],
  768. coupon_ids: '',
  769. total: '',
  770. coupon_list: [],
  771. score: '',
  772. money: '',
  773. })
  774. } else if (form.model.type == 'signin') {
  775. form.model.rules.discounts.push({
  776. full: '',
  777. value: '',
  778. })
  779. }
  780. }
  781. function onDeleteDiscounts(index) {
  782. form.model.rules.discounts.splice(index, 1);
  783. }
  784. function onChangeDiscounts() {
  785. form.model.rules.discounts = []
  786. }
  787. function onChangeLimitNumType() {
  788. if (state.limitNumType == 'all') {
  789. form.model.rules.limit_num = 0;
  790. } else if (state.limitNumType == 'part') {
  791. form.model.rules.limit_num = '';
  792. }
  793. }
  794. function onSelectCoupon(index) {
  795. Fast.api.open(`shopro/coupon/select?multiple=true&status=hidden`, "选择优惠券", {
  796. callback(data) {
  797. form.model.rules.discounts[index].coupon_list.push(...data);
  798. }
  799. })
  800. }
  801. function onDeleteCoupon(index, dindex) {
  802. form.model.rules.discounts[index].coupon_list.splice(dindex, 1);
  803. }
  804. function onSelectArea() {
  805. let selected = {
  806. province: form.model.rules.province_except,
  807. city: form.model.rules.city_except,
  808. district: form.model.rules.district_except,
  809. }
  810. Fast.api.open(`shopro/data/area/select?selected=${encodeURI(JSON.stringify(selected))}`, "选择地区", {
  811. callback(data) {
  812. for (var level in data) {
  813. let ids = [];
  814. for (var id in data[level]) {
  815. ids.push(id);
  816. }
  817. form.model.rules[level + '_except'] = ids.join(',');
  818. }
  819. form.model.rules.district_text = data;
  820. }
  821. })
  822. }
  823. function onAddLadders() {
  824. form.model.rules.ladders.ladder_three = 4;
  825. }
  826. function onDeleteLadders() {
  827. delete form.model.rules.ladders.ladder_three;
  828. }
  829. function onChangeGoodsType() {
  830. if (state.goodsType == 'all') {
  831. form.model.goods_ids = null;
  832. form.model.goods_list = [];
  833. } else if (state.goodsType == 'part') { }
  834. }
  835. function onSelectGoods() {
  836. let ids = [];
  837. form.model.goods_list.forEach((i) => {
  838. ids.push(i.id);
  839. });
  840. Fast.api.open(`shopro/goods/goods/select?multiple=true&ids=${ids.join(',')}`, "选择商品", {
  841. callback(data) {
  842. data.forEach((item) => {
  843. let findItem = form.model.goods_list.find((k) => k.id == item.id);
  844. if (findItem) {
  845. item.activity_sku_prices = findItem.activity_sku_prices;
  846. }
  847. });
  848. form.model.goods_list = data;
  849. }
  850. })
  851. }
  852. function onDeleteGoods(index) {
  853. form.model.goods_list.splice(index, 1);
  854. }
  855. function onSetActivitySkuPrices(index, id) {
  856. localStorage.setItem("activity-skus", JSON.stringify(form.model))
  857. Fast.api.open(`shopro/activity/activity/skus?activityStatus=${state.activityStatus}&goods_id=${id}`, "设置商品", {
  858. callback(data) {
  859. form.model.goods_list[index].activity_sku_prices = data;
  860. }
  861. })
  862. }
  863. function onSelectRichtext() {
  864. Fast.api.open(`shopro/data/richtext/select`, "选选择活动说明", {
  865. callback(data) {
  866. form.model.richtext_title = data.title;
  867. form.model.richtext_id = data.id;
  868. }
  869. })
  870. }
  871. function onConfirm() {
  872. let submitForm = handleForm(JSON.parse(JSON.stringify(form.model)));
  873. submitForm.goods_list = JSON.stringify(submitForm.goods_list)
  874. proxy.$refs['formRef'].validate((valid) => {
  875. if (valid) {
  876. Fast.api.ajax({
  877. url: state.type == 'add' ? 'shopro/activity/activity/add' : `shopro/activity/activity/edit/id/${state.id}`,
  878. type: 'POST',
  879. data: submitForm
  880. }, function (ret, res) {
  881. Fast.api.close()
  882. }, function (ret, res) { })
  883. }
  884. });
  885. }
  886. onMounted(() => {
  887. state.type == 'edit' && getDetail()
  888. if (isActivity.value) {
  889. state.goodsType = 'part';
  890. }
  891. })
  892. return {
  893. state,
  894. isActivity,
  895. form,
  896. onChangeEndtime,
  897. onAddDiscounts,
  898. onDeleteDiscounts,
  899. onChangeDiscounts,
  900. onChangeLimitNumType,
  901. onSelectCoupon,
  902. onDeleteCoupon,
  903. onSelectArea,
  904. onAddLadders,
  905. onDeleteLadders,
  906. onChangeGoodsType,
  907. onSelectGoods,
  908. onDeleteGoods,
  909. onSetActivitySkuPrices,
  910. onSelectRichtext,
  911. onConfirm
  912. }
  913. }
  914. }
  915. createApp('addEdit', addEdit);
  916. },
  917. select: () => {
  918. const { reactive, onMounted } = Vue
  919. const select = {
  920. setup() {
  921. const state = reactive({
  922. type: new URLSearchParams(location.search).get('type'),
  923. data: [],
  924. })
  925. function getData() {
  926. let tempSearch = {
  927. status: 'noend'
  928. };
  929. let search = composeFilter(tempSearch);
  930. Fast.api.ajax({
  931. url: 'shopro/activity/activity/select',
  932. type: 'GET',
  933. data: {
  934. type: state.type,
  935. page: pagination.page,
  936. list_rows: pagination.list_rows,
  937. ...search,
  938. },
  939. }, function (ret, res) {
  940. state.data = res.data.data
  941. pagination.total = res.data.total
  942. return false
  943. }, function (ret, res) { })
  944. }
  945. const pagination = reactive({
  946. page: 1,
  947. list_rows: 10,
  948. total: 0,
  949. })
  950. function onConfirm(item) {
  951. Fast.api.close(item)
  952. }
  953. onMounted(() => {
  954. getData()
  955. })
  956. return {
  957. state,
  958. getData,
  959. pagination,
  960. onConfirm,
  961. }
  962. }
  963. }
  964. createApp('select', select);
  965. },
  966. recyclebin: () => {
  967. const { reactive, onMounted } = Vue
  968. const recyclebin = {
  969. setup() {
  970. const state = reactive({
  971. activity_type: new URLSearchParams(location.search).get('activity_type'),
  972. data: [],
  973. order: '',
  974. sort: '',
  975. })
  976. function getData() {
  977. Fast.api.ajax({
  978. url: 'shopro/activity/activity/recyclebin',
  979. type: 'GET',
  980. data: {
  981. type: state.activity_type,
  982. page: pagination.page,
  983. list_rows: pagination.list_rows,
  984. order: state.order,
  985. sort: state.sort,
  986. },
  987. }, function (ret, res) {
  988. state.data = res.data.data
  989. pagination.total = res.data.total
  990. return false
  991. }, function (ret, res) { })
  992. }
  993. function onChangeSort({ prop, order }) {
  994. state.order = order == 'ascending' ? 'asc' : 'desc';
  995. state.sort = prop;
  996. getData();
  997. }
  998. const pagination = reactive({
  999. page: 1,
  1000. list_rows: 10,
  1001. total: 0,
  1002. })
  1003. onMounted(() => {
  1004. getData()
  1005. })
  1006. return {
  1007. state,
  1008. getData,
  1009. onChangeSort,
  1010. pagination,
  1011. }
  1012. }
  1013. }
  1014. createApp('recyclebin', recyclebin);
  1015. },
  1016. skus: () => {
  1017. const { reactive, computed, onMounted } = Vue
  1018. const skus = {
  1019. setup() {
  1020. const state = reactive({
  1021. model: JSON.parse(localStorage.getItem("activity-skus")) || {},
  1022. goods_id: new URLSearchParams(location.search).get('goods_id'),
  1023. activityStatus: Number(new URLSearchParams(location.search).get('activityStatus')),
  1024. skus: [],
  1025. sku_prices: [],
  1026. activity_sku_prices: [],
  1027. })
  1028. const currentItem = computed(() => state.model.goods_list.find(
  1029. (item) => item.id == state.goods_id,
  1030. ))
  1031. function getSkus() {
  1032. Fast.api.ajax({
  1033. url: 'shopro/activity/activity/skus',
  1034. type: 'GET',
  1035. data: {
  1036. id: state.model.id,
  1037. goods_id: state.goods_id,
  1038. activity_type: state.model.type,
  1039. start_time: state.model.start_time,
  1040. end_time: state.model.end_time,
  1041. prehead_time: state.model.prehead_time,
  1042. }
  1043. }, function (ret, res) {
  1044. state.skus = res.data.skus;
  1045. state.sku_prices = res.data.sku_prices;
  1046. state.activity_sku_prices = currentItem.value?.activity_sku_prices || res.data.activity_sku_prices;
  1047. return false
  1048. }, function (ret, res) { })
  1049. }
  1050. function onConfirm() {
  1051. Fast.api.close(state.activity_sku_prices)
  1052. }
  1053. onMounted(() => {
  1054. getSkus()
  1055. })
  1056. return {
  1057. state,
  1058. onConfirm
  1059. }
  1060. }
  1061. }
  1062. createApp('skus', skus);
  1063. },
  1064. };
  1065. return Controller;
  1066. });