PointRuleAdd.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. <template>
  2. <ContainerTit>
  3. <div slot="headr">
  4. <el-button :loading="sub_load" type="primary" @click="submit">
  5. 提交保存
  6. </el-button>
  7. </div>
  8. <div class="detail-tab-item">
  9. <div class="detail-tab-title">股权规则</div>
  10. <div class="detail-tab-main">
  11. <el-form
  12. ref="add_form"
  13. label-position="right"
  14. :model="add_form"
  15. :rules="form_rules"
  16. size="small"
  17. label-width="100px"
  18. >
  19. <el-form-item label="规则说明">
  20. <el-tooltip effect="light" placement="bottom">
  21. <div slot="content">
  22. 当客户下单时,同时满足多个股权奖励规则时,
  23. <br />
  24. 按照商品股权规则>商品分类规则>订单股权规则的顺序执行股权政策
  25. <br />
  26. 【例如】:客户下单时,既有订单股权奖励,也有商品分类和某个商品的股权奖励,
  27. <br />
  28. 计算订单中的订单股权时,需要将满足商品分类和商品股权的金额减去,
  29. <br />
  30. 再算根据剩余的订单金额计算奖励股权,再将商品分类所得股权和商品所得股权累加,
  31. <br />
  32. 即该笔订单总获得股权。
  33. </div>
  34. <i style="color: #6c6c6c" class="el-icon-question"></i>
  35. </el-tooltip>
  36. </el-form-item>
  37. <el-form-item label="规则名称" prop="title">
  38. <el-input
  39. v-model="add_form.title"
  40. style="width: 300px"
  41. size="small"
  42. placeholder="规则名称"
  43. ></el-input>
  44. </el-form-item>
  45. <el-form-item label="规则类型">
  46. <div>
  47. <el-checkbox v-model="order_checked">按订单奖励股权</el-checkbox>
  48. </div>
  49. <div v-if="order_checked">
  50. <span>单笔订单满</span>
  51. <el-input-number
  52. v-model="add_form.startMoney"
  53. style="margin: 0 10px"
  54. :min="0"
  55. :controls="false"
  56. ></el-input-number>
  57. <span>元,每消费</span>
  58. <el-input-number
  59. v-model="add_form.amount"
  60. style="margin: 0 10px"
  61. :min="0"
  62. :controls="false"
  63. ></el-input-number>
  64. <span>元,奖励</span>
  65. <el-input-number
  66. v-model="add_form.integral"
  67. style="margin: 0 10px"
  68. :min="0"
  69. :controls="false"
  70. ></el-input-number>
  71. <span>股权</span>
  72. </div>
  73. </el-form-item>
  74. <el-form-item label=" ">
  75. <div>
  76. <el-checkbox v-model="goods_checked">按商品奖励股权</el-checkbox>
  77. </div>
  78. <el-table v-if="goods_checked" :data="goods_list" size="mini">
  79. <el-table-column
  80. label="#"
  81. width="60"
  82. type="index"
  83. ></el-table-column>
  84. <el-table-column
  85. label="商品编码"
  86. width="140"
  87. prop="goodsCode"
  88. show-overflow-tooltip
  89. ></el-table-column>
  90. <el-table-column
  91. prop="goodsName"
  92. label="商品名称"
  93. min-width="180"
  94. >
  95. <template slot-scope="scope">
  96. <ConditionSelGoods
  97. v-model="scope.row.goodsName"
  98. :is-reveal-sku="4"
  99. :enable-status="5"
  100. :spec-check="spec_check"
  101. @selGoods="selGoods"
  102. @specSelConfirm="specSelConfirm"
  103. @goodsVisibleChange="
  104. goodsVisibleChange($event, scope.$index)
  105. "
  106. />
  107. </template>
  108. </el-table-column>
  109. <el-table-column prop="specGropName" label="规格" min-width="160">
  110. <template slot-scope="scope">
  111. <span v-if="scope.row.unitName">
  112. {{ scope.row.unitName }};
  113. </span>
  114. <span>{{ scope.row.specGroupName }}</span>
  115. </template>
  116. </el-table-column>
  117. <el-table-column prop="integral" label="股权" min-width="160">
  118. <template slot="header" slot-scope="scope">
  119. <span v-if="false">{{ scope.$index }}</span>
  120. <span style="color: #f40">*</span>
  121. <span style="margin: 0 5px">股权</span>
  122. <el-input
  123. v-model="integral"
  124. style="width: calc(100% - 100px)"
  125. size="mini"
  126. type="number"
  127. placeholder="批量填充股权"
  128. >
  129. <el-button slot="append" @click="batchInput">
  130. 批量填充
  131. </el-button>
  132. </el-input>
  133. </template>
  134. <template slot-scope="scope">
  135. <el-input-number
  136. v-model="scope.row.integral"
  137. style="width: 100%"
  138. size="mini"
  139. :min="0"
  140. placeholder="股权"
  141. :controls="false"
  142. />
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="管理" fixed="right" width="140">
  146. <template slot-scope="scope">
  147. <el-button
  148. type="text"
  149. size="mini"
  150. :disabled="goods_list.length === 1"
  151. @click="delData(scope.$index, scope.row)"
  152. >
  153. 删除
  154. </el-button>
  155. <el-button type="text" size="mini" @click="addListGoods">
  156. 新增
  157. </el-button>
  158. </template>
  159. </el-table-column>
  160. </el-table>
  161. </el-form-item>
  162. </el-form>
  163. </div>
  164. </div>
  165. </ContainerTit>
  166. </template>
  167. <script>
  168. import ConditionSelGoods from "@/component/common/ConditionSelGoods";
  169. import {
  170. addIntegralRule,
  171. updateIntegralRule,
  172. getIntegralRuleInfo,
  173. } from "@/api/Integral";
  174. const goods = {
  175. id: "",
  176. goodsCode: "",
  177. goodsName: "",
  178. skuId: "",
  179. unitName: "",
  180. specGroupName: "",
  181. integral: "",
  182. };
  183. export default {
  184. name: "PointRuleAdd",
  185. components: {
  186. ConditionSelGoods,
  187. },
  188. data() {
  189. return {
  190. sub_load: false,
  191. goods_index: 0,
  192. spec_check: [],
  193. form_rules: {
  194. title: [
  195. { required: true, message: "请输入规则名称", trigger: "blur" },
  196. ],
  197. },
  198. integral: "",
  199. goods_list: [
  200. {
  201. id: "",
  202. goodsCode: "",
  203. integral: "",
  204. unitName: "",
  205. skuId: "",
  206. specGroupName: "",
  207. goodsName: "",
  208. },
  209. ],
  210. order_checked: true,
  211. goods_checked: false,
  212. add_form: {
  213. title: "",
  214. amount: "",
  215. startMoney: "",
  216. integral: "",
  217. goods: {},
  218. },
  219. rule_id: "",
  220. };
  221. },
  222. created() {
  223. if (this.$route.query.id) {
  224. this.rule_id = this.$route.query.id;
  225. this.getIntegralRuleInfo();
  226. }
  227. },
  228. activated() {
  229. if (this.$_isInit()) return;
  230. if (this.$route.query.id) {
  231. this.rule_id = this.$route.query.id;
  232. this.getIntegralRuleInfo();
  233. }
  234. },
  235. methods: {
  236. // 获取详情
  237. async getIntegralRuleInfo() {
  238. const { data } = await getIntegralRuleInfo(this.rule_id);
  239. this.add_form = {
  240. title: data.title,
  241. amount: data.amount,
  242. startMoney: data.startMoney,
  243. integral: data.integral,
  244. goods: data.goods,
  245. };
  246. this.order_checked = !!Number(data.amount);
  247. if (Array.isArray(data.goods)) {
  248. this.goods_list = [
  249. {
  250. id: "",
  251. goodsCode: "",
  252. integral: "",
  253. unitName: "",
  254. skuId: "",
  255. specGroupName: "",
  256. goodsName: "",
  257. },
  258. ];
  259. } else {
  260. this.goods_list = Object.values(data.goods);
  261. }
  262. this.goods_checked = !Array.isArray(data.goods);
  263. },
  264. // 选择商品
  265. selGoods(list) {
  266. let target = this.$_common.deepClone(this.goods_list);
  267. const goodsD = list.map((item) => {
  268. let specGroupName = item.specGroup
  269. .map((itemS) => {
  270. return itemS.specValueName;
  271. })
  272. .join("_");
  273. return {
  274. id: item.id,
  275. goodsCode: item.code,
  276. goodsName: item.title,
  277. skuId: item.skuId,
  278. specGroupName: specGroupName,
  279. unitName: item.unitName,
  280. integral: 0,
  281. };
  282. });
  283. target = this.$_common.unique(target.concat(goodsD), ["id", "skuId"]);
  284. this.goods_list = target.filter((item) => item.goodsName);
  285. this.addListGoods();
  286. },
  287. goodsVisibleChange(visible, index) {
  288. if (visible) {
  289. this.goods_index = index;
  290. }
  291. },
  292. // 批量填充
  293. batchInput() {
  294. if (this.integral <= 0) {
  295. this.$message.warning("请输入大于0的值");
  296. return;
  297. }
  298. this.goods_list.forEach((item) => {
  299. item.integral = this.integral;
  300. });
  301. },
  302. specSelConfirm(params) {
  303. if (!params.goodsD[0].skuId) {
  304. this.$message.warning("至少选择一项");
  305. return;
  306. }
  307. let target = this.$_common.deepClone(this.goods_list);
  308. const goodsD = params.goodsD.map((item) => {
  309. return {
  310. id: params.now_goods_data.id,
  311. goodsCode: params.now_goods_data.code,
  312. goodsName: params.now_goods_data.title,
  313. skuId: item.skuId,
  314. specGropName: item.spec.specGropName,
  315. unitName: item.spec.unitName,
  316. integral: "",
  317. };
  318. });
  319. target = this.$_common.unique(target.concat(goodsD), ["id", "skuId"]);
  320. this.goods_list = target.filter((item) => item.goodsName);
  321. this.addListGoods();
  322. },
  323. addListGoods() {
  324. this.goods_list.push(this.$_common.deepClone(goods));
  325. },
  326. delData(index) {
  327. this.goods_list.splice(index, 1);
  328. },
  329. async submit() {
  330. this.$refs["add_form"].validate(async (valid) => {
  331. if (valid) {
  332. if (!this.order_checked && !this.goods_checked) {
  333. this.$message.warning("至少设置一种股权奖励规则类型");
  334. return;
  335. }
  336. if (this.order_checked) {
  337. if (!this.add_form.amount) {
  338. this.$message.warning("请输入订单金额");
  339. return;
  340. }
  341. if (!this.add_form.integral) {
  342. this.$message.warning("订单奖励股权需大于0");
  343. return;
  344. }
  345. }
  346. const goodsList = this.goods_list.filter((item) => !!item.skuId);
  347. if (this.goods_checked) {
  348. if (!goodsList.length) {
  349. this.$message.warning("请选择商品");
  350. return;
  351. }
  352. }
  353. const isIntergral = goodsList.every((item) => item.integral > 0);
  354. if (!isIntergral) {
  355. this.$message.warning("按商品奖励股权规则,股权需大于0");
  356. return;
  357. }
  358. let goods = {};
  359. goodsList.forEach((item) => {
  360. goods[item.skuId] = item;
  361. });
  362. const params = {
  363. ...this.add_form,
  364. goods: goods,
  365. };
  366. this.sub_load = true;
  367. try {
  368. if (this.rule_id) {
  369. const data = await updateIntegralRule(this.rule_id, params);
  370. } else {
  371. const data = await addIntegralRule(params);
  372. }
  373. this.sub_load = false;
  374. this.$message.success("提交成功");
  375. this.$closeCurrentGoEdit("/PointsMall/PointRule");
  376. } finally {
  377. this.sub_load = false;
  378. }
  379. }
  380. });
  381. },
  382. },
  383. };
  384. </script>
  385. <style scoped></style>