猫妈狗爸伴宠师小程序后端代码
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.

527 lines
21 KiB

6 months ago
3 weeks ago
6 months ago
3 weeks ago
6 months ago
3 weeks ago
6 months ago
6 months ago
6 months ago
3 weeks ago
6 months ago
6 months ago
3 weeks ago
6 months ago
6 months ago
6 months ago
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
  4. <el-form-item label="批次号" prop="stockId">
  5. <el-input
  6. v-model="queryParams.stockId"
  7. placeholder="请输入批次号"
  8. clearable
  9. size="small"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item label="批次名称 " prop="stockName">
  14. <el-input
  15. v-model="queryParams.stockName"
  16. placeholder="请输入商家券批次名称 "
  17. clearable
  18. size="small"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item label="批次状态" prop="stockState">
  23. <el-input
  24. v-model="queryParams.stockState"
  25. placeholder="请输入批次状态"
  26. clearable
  27. size="small"
  28. @keyup.enter.native="handleQuery"
  29. />
  30. </el-form-item>
  31. <el-form-item label="批次类型" prop="stockType">
  32. <el-select v-model="queryParams.stockType" placeholder="请选择批次类型" clearable size="small">
  33. <el-option label="微信满减券" value="NORMAL" />
  34. <el-option label="微信折扣券" value="DISCOUNT" />
  35. <el-option label="微信换购券" value="EXCHANGE" />
  36. <el-option label="平台满减券" value="PNORMAL" />
  37. <el-option label="平台折扣券" value="PDISCOUNT" />
  38. <el-option label="平台体验券" value="PTRAIL" />
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="发送类型" prop="sendType">
  42. <el-select v-model="queryParams.sendType" placeholder="发送类型" clearable size="small">
  43. <el-option label="自动发送" value="AUTO" />
  44. <el-option label="手动发送" value="MANUAL" />
  45. <el-option label="新用户领取" value="newUser" />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="自动触发事件" prop="eventType">
  49. <el-select v-model="queryParams.eventType" placeholder="请选自动触发事件" clearable size="small">
  50. <el-option label="用户注册成功" value="registered_successfully" />
  51. <el-option label="用户下单成功" value="checkout_success " />
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="折扣类型" prop="discountType">
  55. <el-select v-model="queryParams.discountType" placeholder="请选择折扣类型" clearable size="small">
  56. <el-option label="按订单折扣" value="BYORDER" />
  57. <el-option label="按服务天数" value="BYSERVICEDAY" />
  58. </el-select>
  59. </el-form-item>
  60. <el-form-item label="开始时间" prop="availableBeginTime">
  61. <el-date-picker
  62. clearable
  63. size="small"
  64. v-model="queryParams.availableBeginTime"
  65. type="datetime"
  66. value-format="yyyy-MM-dd HH:mm:ss"
  67. placeholder="选择开始时间">
  68. </el-date-picker>
  69. </el-form-item>
  70. <el-form-item label="结束时间" prop="availableEndTime">
  71. <el-date-picker
  72. clearable
  73. size="small"
  74. v-model="queryParams.availableEndTime"
  75. type="datetime"
  76. value-format="yyyy-MM-dd HH:mm:ss"
  77. placeholder="选择结束时间">
  78. </el-date-picker>
  79. </el-form-item>
  80. <el-form-item class="flex_one tr">
  81. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  82. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  83. </el-form-item>
  84. </el-form>
  85. <el-row :gutter="10" class="mb8">
  86. <el-col :span="1.5">
  87. <el-button
  88. type="primary"
  89. plain
  90. icon="el-icon-plus"
  91. size="mini"
  92. @click="handleAdd"
  93. v-hasPermi="['mall:wechatStock:add']"
  94. >新增</el-button>
  95. </el-col>
  96. <el-col :span="1.5">
  97. <el-button
  98. type="success"
  99. plain
  100. icon="el-icon-edit"
  101. size="mini"
  102. :disabled="single"
  103. @click="handleUpdate"
  104. v-hasPermi="['mall:wechatStock:edit']"
  105. >修改</el-button>
  106. </el-col>
  107. <el-col :span="1.5">
  108. <el-button
  109. type="danger"
  110. plain
  111. icon="el-icon-delete"
  112. size="mini"
  113. :disabled="multiple"
  114. @click="handleDelete"
  115. v-hasPermi="['mall:wechatStock:remove']"
  116. >删除</el-button>
  117. </el-col>
  118. <el-col :span="1.5">
  119. <el-button
  120. type="warning"
  121. plain
  122. icon="el-icon-download"
  123. size="mini"
  124. :loading="exportLoading"
  125. @click="handleExport"
  126. v-hasPermi="['mall:wechatStock:export']"
  127. >导出</el-button>
  128. </el-col>
  129. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
  130. </el-row>
  131. <el-table v-loading="loading" :data="wechatStockList" @selection-change="handleSelectionChange">
  132. <el-table-column type="selection" width="55" align="center" />
  133. <el-table-column label="商家券批次名称 " align="center" prop="stockName" v-if="columns[0].visible"/>
  134. <el-table-column label="批次号" align="center" prop="stockId" v-if="columns[16].visible"/>
  135. <el-table-column label="批次状态" align="center" prop="stockState" v-if="columns[15].visible"/>
  136. <el-table-column label="批次备注" align="center" prop="comment" v-if="columns[1].visible"/>
  137. <el-table-column label="适用商品范围" align="center" prop="goodsName" v-if="columns[2].visible"/>
  138. <el-table-column label="批次类型" align="center" prop="stockType" v-if="columns[3].visible"/>
  139. <el-table-column label="开始时间" align="center" prop="availableBeginTime" width="180" v-if="columns[4].visible">
  140. <template slot-scope="scope">
  141. <span>{{ parseTime(scope.row.availableBeginTime, '')}}</span>
  142. </template>
  143. </el-table-column>
  144. <el-table-column label="结束时间" align="center" prop="availableEndTime" width="180" v-if="columns[5].visible">
  145. <template slot-scope="scope">
  146. <span>{{ parseTime(scope.row.availableEndTime, '')}}</span>
  147. </template>
  148. </el-table-column>
  149. <el-table-column label="领取后N天开始生效" align="center" prop="availableDayAfterReceive" v-if="columns[6].visible"/>
  150. <el-table-column label="优惠金额" align="center" prop="discountAmount" v-if="columns[7].visible"/>
  151. <el-table-column label="消费门槛" align="center" prop="transactionMinimum" v-if="columns[8].visible"/>
  152. <el-table-column label="折扣比例" align="center" prop="discountPercent" v-if="columns[9].visible"/>
  153. <el-table-column label="核销方式" align="center" prop="useMethod" v-if="columns[10].visible"/>
  154. <el-table-column label="商户请求单号" align="center" prop="outRequestNo" v-if="columns[11].visible"/>
  155. <el-table-column label="批次最大发放个数" align="center" prop="maxCoupons" v-if="columns[12].visible"/>
  156. <el-table-column label="用户最大可领个数" align="center" prop="maxCouponsPerUser" v-if="columns[13].visible"/>
  157. <el-table-column label="批次已发放个数" align="center" prop="giveNum" v-if="columns[13].visible"/>
  158. <el-table-column label="券code模式" align="center" prop="couponCodeMode" v-if="columns[14].visible"/>
  159. <el-table-column label="发送类型" align="center" prop="sendType">
  160. <template slot-scope="scope">
  161. <span v-if="scope.row.sendType == 'AUTO'">自动发送</span>
  162. <span v-if="scope.row.sendType == 'MANUAL'">手动发送</span>
  163. <span v-if="scope.row.sendType == 'newUser'">新用户领取</span>
  164. </template>
  165. </el-table-column>
  166. <el-table-column label="触发事件" align="center" prop="eventType" />
  167. <!-- <el-table-column label="折扣类型" align="center" prop="discountType" />-->
  168. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  169. <template slot-scope="scope">
  170. <el-button
  171. size="mini"
  172. type="text"
  173. icon="el-icon-edit"
  174. @click="handleUpdate(scope.row)"
  175. v-hasPermi="['mall:wechatStock:edit']"
  176. >修改</el-button>
  177. <el-button
  178. size="mini"
  179. type="text"
  180. icon="el-icon-delete"
  181. @click="handleDelete(scope.row)"
  182. v-hasPermi="['mall:wechatStock:remove']"
  183. >删除</el-button>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <pagination
  188. v-show="total>0"
  189. :total="total"
  190. :page.sync="queryParams.pageNum"
  191. :limit.sync="queryParams.pageSize"
  192. @pagination="getList"
  193. />
  194. <!-- 添加或修改微信商家券对话框 -->
  195. <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
  196. <el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
  197. <el-form-item label="批次名称 " prop="stockName">
  198. <el-input v-model="form.stockName" placeholder="请输入商家券批次名称 " />
  199. </el-form-item>
  200. <el-form-item label="批次备注" prop="comment">
  201. <el-input v-model="form.comment" placeholder="请输入批次备注" />
  202. </el-form-item>
  203. <el-form-item label="适用商品范围" prop="goodsName">
  204. <el-input v-model="form.goodsName" placeholder="请输入适用商品范围" />
  205. </el-form-item>
  206. <el-form-item label="批次类型" prop="stockType">
  207. <el-select v-model="form.stockType" placeholder="请选择批次类型">
  208. <!-- <el-option label="微信满减券" value="NORMAL" />-->
  209. <!-- <el-option label="微信折扣券" value="DISCOUNT" />-->
  210. <!-- <el-option label="微信换购券" value="EXCHANGE" />-->
  211. <el-option label="平台满减券" value="PNORMAL" />
  212. <el-option label="平台折扣券" value="PDISCOUNT" />
  213. <el-option label="平台体验券" value="PTRAIL" />
  214. </el-select>
  215. </el-form-item>
  216. <el-form-item label="开始时间" prop="availableBeginTime">
  217. <el-date-picker clearable size="small"
  218. v-model="form.availableBeginTime"
  219. type="datetime"
  220. value-format="yyyy-MM-dd HH:mm:ss"
  221. placeholder="选择开始时间">
  222. </el-date-picker>
  223. </el-form-item>
  224. <el-form-item label="结束时间" prop="availableEndTime">
  225. <el-date-picker clearable size="small"
  226. v-model="form.availableEndTime"
  227. type="datetime"
  228. value-format="yyyy-MM-dd HH:mm:ss"
  229. placeholder="选择结束时间">
  230. </el-date-picker>
  231. </el-form-item>
  232. <el-form-item label="领取后N天开始生效" prop="availableDayAfterReceive">
  233. <el-input v-model="form.availableDayAfterReceive" placeholder="请输入领取后N天开始生效" />
  234. </el-form-item>
  235. <el-form-item label="优惠金额" prop="discountAmount">
  236. <el-input v-model="form.discountAmount" placeholder="请输入固定面额满减券-优惠金额" />
  237. </el-form-item>
  238. <el-form-item label="消费门槛" prop="transactionMinimum">
  239. <el-input v-model="form.transactionMinimum" placeholder="请输入消费门槛" />
  240. </el-form-item>
  241. <el-form-item label="折扣比例" prop="discountPercent">
  242. <el-input v-model="form.discountPercent" placeholder="请输入折扣比例" />
  243. </el-form-item>
  244. <el-form-item label="批次最大发放个数" prop="maxCoupons">
  245. <el-input v-model="form.maxCoupons" placeholder="请输入批次最大发放个数" />
  246. </el-form-item>
  247. <el-form-item label="用户最大可领个数" prop="maxCouponsPerUser">
  248. <el-input v-model="form.maxCouponsPerUser" placeholder="请输入用户最大可领个数" />
  249. </el-form-item>
  250. <el-form-item label="发放类型" prop="sendType">
  251. <el-select v-model="form.sendType" placeholder="请选择发放类型">
  252. <el-option label="自动发送" value="AUTO" />
  253. <el-option label="手动发送" value="MANUAL" />
  254. <el-option label="新用户领取" value="newUser" />
  255. </el-select>
  256. </el-form-item>
  257. <el-form-item label="自动触发事件" prop="eventType">
  258. <el-select v-model="form.eventType" placeholder="请选自动触发事件">
  259. <el-option label="用户注册成功" value="registered_successfully" />
  260. <el-option label="用户下单成功" value="checkout_success " />
  261. </el-select>
  262. </el-form-item>
  263. <el-form-item label="海报" prop="couponPoster">
  264. <oss-image-upload v-model="form.couponPoster" :limit="1"></oss-image-upload>
  265. </el-form-item>
  266. <el-form-item label="折扣类型" prop="discountType">
  267. <el-select v-model="form.discountType" placeholder="请选择折扣类型">
  268. <el-option label="按订单折扣" value="BYORDER" />
  269. <el-option label="按服务天数" value="BYSERVICEDAY" />
  270. </el-select>
  271. </el-form-item>
  272. </el-form>
  273. <div slot="footer" class="dialog-footer">
  274. <el-button type="primary" @click="submitForm"> </el-button>
  275. <el-button @click="cancel"> </el-button>
  276. </div>
  277. </el-dialog>
  278. </div>
  279. </template>
  280. <script>
  281. import { listWechatStock, getWechatStock, delWechatStock, addWechatStock, updateWechatStock, exportWechatStock } from "@/api/marketing/wechatStock";
  282. export default {
  283. name: "WechatStock",
  284. data() {
  285. return {
  286. // 遮罩层
  287. loading: true,
  288. // 导出遮罩层
  289. exportLoading: false,
  290. // 选中数组
  291. ids: [],
  292. // 非单个禁用
  293. single: true,
  294. // 非多个禁用
  295. multiple: true,
  296. // 显示搜索条件
  297. showSearch: true,
  298. // 总条数
  299. total: 0,
  300. // 微信商家券表格数据
  301. wechatStockList: [],
  302. // 弹出层标题
  303. title: "",
  304. // 是否显示弹出层
  305. open: false,
  306. // 查询参数
  307. queryParams: {
  308. pageNum: 1,
  309. pageSize: 10,
  310. orderByColumn: "create_time",
  311. isAsc: "desc",
  312. stockName: null,
  313. comment: null,
  314. goodsName: null,
  315. stockType: null,
  316. availableBeginTime: null,
  317. availableEndTime: null,
  318. availableDayAfterReceive: null,
  319. discountAmount: null,
  320. transactionMinimum: null,
  321. discountPercent: null,
  322. useMethod: null,
  323. outRequestNo: null,
  324. maxCoupons: null,
  325. maxCouponsPerUser: null,
  326. couponCodeMode: null,
  327. stockState: null,
  328. stockId: null,
  329. sendType: null,
  330. discountType: null,
  331. eventType: null,
  332. },
  333. // 表单参数
  334. form: {},
  335. // 表单校验
  336. rules: {
  337. stockName: [
  338. { required: true, message: "批次名称 不能为空", trigger: "blur" }
  339. ],
  340. goodsName: [
  341. { required: true, message: "适用商品范围不能为空", trigger: "blur" }
  342. ],
  343. stockType: [
  344. { required: true, message: "批次类型不能为空", trigger: "change" }
  345. ],
  346. availableBeginTime: [
  347. { required: true, message: "开始时间不能为空", trigger: "blur" }
  348. ],
  349. availableEndTime: [
  350. { required: true, message: "结束时间不能为空", trigger: "blur" }
  351. ],
  352. maxCoupons: [
  353. { required: true, message: "批次最大发放个数不能为空", trigger: "blur" }
  354. ],
  355. maxCouponsPerUser: [
  356. { required: true, message: "用户最大可领个数不能为空", trigger: "blur" }
  357. ],
  358. availableDayAfterReceive: [
  359. { required: true, message: "领取后N天开始生效不能为空", trigger: "blur" }
  360. ],
  361. },
  362. columns: [
  363. { key: 1, label: "批次名称 ", visible: true },
  364. { key: 2, label: "批次备注", visible: true },
  365. { key: 3, label: "适用商品范围", visible: true },
  366. { key: 4, label: "批次类型", visible: true },
  367. { key: 5, label: "开始时间", visible: true },
  368. { key: 6, label: "结束时间", visible: true },
  369. { key: 7, label: "领取后N天开始生效", visible: true },
  370. { key: 8, label: "优惠金额", visible: true },
  371. { key: 9, label: "消费门槛", visible: true },
  372. { key: 10, label: "折扣比例", visible: true },
  373. { key: 11, label: "核销方式", visible: false },
  374. { key: 12, label: "商户请求单号", visible: false },
  375. { key: 13, label: "批次最大发放个数", visible: true },
  376. { key: 14, label: "用户最大可领个数", visible: true },
  377. { key: 15, label: "券code模式。", visible: false },
  378. { key: 16, label: "批次状态", visible: true },
  379. { key: 17, label: "批次号", visible: true },
  380. ],
  381. showMoreCondition: false
  382. };
  383. },
  384. created() {
  385. this.getList();
  386. },
  387. methods: {
  388. /** 查询微信商家券列表 */
  389. getList() {
  390. this.loading = true;
  391. listWechatStock(this.queryParams).then(response => {
  392. this.wechatStockList = response.rows;
  393. this.total = response.total;
  394. this.loading = false;
  395. });
  396. },
  397. // 取消按钮
  398. cancel() {
  399. this.open = false;
  400. this.reset();
  401. },
  402. // 表单重置
  403. reset() {
  404. this.form = {
  405. id: null,
  406. stockName: null,
  407. comment: null,
  408. goodsName: null,
  409. stockType: null,
  410. availableBeginTime: null,
  411. availableEndTime: null,
  412. availableDayAfterReceive: null,
  413. discountAmount: null,
  414. transactionMinimum: null,
  415. discountPercent: null,
  416. useMethod: null,
  417. outRequestNo: null,
  418. maxCoupons: null,
  419. maxCouponsPerUser: null,
  420. couponCodeMode: null,
  421. stockState: null,
  422. stockId: null,
  423. createBy: null,
  424. createTime: null,
  425. updateBy: null,
  426. sendType: null,
  427. discountType: null,
  428. eventType: null,
  429. updateTime: null,
  430. sendType: null,
  431. discountType: null,
  432. eventType: null,
  433. couponPoster : null,
  434. };
  435. this.resetForm("form");
  436. },
  437. /** 搜索按钮操作 */
  438. handleQuery() {
  439. this.queryParams.pageNum = 1;
  440. this.getList();
  441. },
  442. /** 重置按钮操作 */
  443. resetQuery() {
  444. this.resetForm("queryForm");
  445. this.handleQuery();
  446. },
  447. // 多选框选中数据
  448. handleSelectionChange(selection) {
  449. this.ids = selection.map(item => item.id)
  450. this.single = selection.length!==1
  451. this.multiple = !selection.length
  452. },
  453. /** 新增按钮操作 */
  454. handleAdd() {
  455. this.reset();
  456. this.open = true;
  457. this.title = "添加微信商家券";
  458. },
  459. /** 修改按钮操作 */
  460. handleUpdate(row) {
  461. this.reset();
  462. const id = row.id || this.ids
  463. getWechatStock(id).then(response => {
  464. this.form = response.data;
  465. this.open = true;
  466. this.title = "修改微信商家券";
  467. });
  468. },
  469. /** 提交按钮 */
  470. submitForm() {
  471. this.$refs["form"].validate(valid => {
  472. if (valid) {
  473. if (this.form.id != null) {
  474. updateWechatStock(this.form).then(response => {
  475. this.$modal.msgSuccess("修改成功");
  476. this.open = false;
  477. this.getList();
  478. });
  479. } else {
  480. addWechatStock(this.form).then(response => {
  481. this.$modal.msgSuccess("新增成功");
  482. this.open = false;
  483. this.getList();
  484. });
  485. }
  486. }
  487. });
  488. },
  489. /** 删除按钮操作 */
  490. handleDelete(row) {
  491. const ids = row.id || this.ids;
  492. this.$modal.confirm('是否确认删除微信商家券编号为"' + ids + '"的数据项?').then(function() {
  493. return delWechatStock(ids);
  494. }).then(() => {
  495. this.getList();
  496. this.$modal.msgSuccess("删除成功");
  497. }).catch(() => {});
  498. },
  499. /** 导出按钮操作 */
  500. handleExport() {
  501. const queryParams = this.queryParams;
  502. this.$modal.confirm('是否确认导出所有微信商家券数据项?').then(() => {
  503. this.exportLoading = true;
  504. return exportWechatStock(queryParams);
  505. }).then(response => {
  506. this.download(response.msg);
  507. this.exportLoading = false;
  508. }).catch(() => {});
  509. }
  510. }
  511. };
  512. </script>