orderAuditDetail.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. <template>
  2. <div>
  3. <el-form :inline="true" ref="ruleForm">
  4. <div class="lookTitle">申请信息</div>
  5. <el-form-item label="申请人" label-width="80px">
  6. <div style="width: 180px">
  7. <p v-if="form.operator && form.operator.username">
  8. {{ form.operator.username }}
  9. </p>
  10. </div>
  11. </el-form-item>
  12. <el-form-item label="申请时间" label-width="80px">
  13. <div style="width: 180px">{{ form.createTime }}</div>
  14. </el-form-item>
  15. </el-form>
  16. <el-form :model="form" ref="ruleForm">
  17. <div class="lookTitle">基本信息</div>
  18. <el-form-item
  19. label="所属分部"
  20. :rules="[{ required: true, message: '请选择分部', trigger: 'change' }]"
  21. prop="routeOrganId"
  22. :label-width="formLabelWidth"
  23. >
  24. <!-- -->
  25. <el-select
  26. v-model.trim="form.routeOrganId"
  27. :disabled="!isAdd"
  28. @change="changeOrgin"
  29. style="width: 100% !important"
  30. >
  31. <el-option
  32. v-for="(item, index) in selects.branchs"
  33. :key="index"
  34. :label="item.name"
  35. :value="item.id"
  36. ></el-option>
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item
  40. label="所属学校"
  41. prop="schoolId"
  42. :label-width="formLabelWidth"
  43. >
  44. <!-- @change="checkSchool" -->
  45. <el-select
  46. v-model="form.schoolId"
  47. :disabled="!isAdd"
  48. style="width: 100% !important"
  49. >
  50. <el-option
  51. v-for="(item, index) in cooperationList"
  52. :key="index"
  53. :label="item.name"
  54. :value="item.id"
  55. ></el-option>
  56. </el-select>
  57. </el-form-item>
  58. <!-- 订单类型 -->
  59. <el-form-item
  60. label="订单类型"
  61. prop="insertOrderType"
  62. :label-width="formLabelWidth"
  63. >
  64. <el-radio-group v-model="insertOrderType" :disabled="!isAdd">
  65. <el-radio :label="1">个人订单</el-radio>
  66. <el-radio :label="2">学校订单</el-radio>
  67. <el-radio :label="3">其它订单</el-radio>
  68. </el-radio-group>
  69. </el-form-item>
  70. <el-form-item
  71. label="缴费单号"
  72. prop="calenderId"
  73. v-if="insertOrderType == 2 || insertOrderType == 3"
  74. :label-width="formLabelWidth"
  75. :rules="[{pattern:/^[0-9]*$/,message:'请输入正确的缴费单号',trigger: 'blur'}]"
  76. >
  77. <el-input
  78. v-model.trim="form.calenderId"
  79. :disabled="!isAdd"
  80. placeholder="请输入缴费单号"
  81. ></el-input>
  82. </el-form-item>
  83. <el-form-item
  84. label="学员编号"
  85. prop="userId"
  86. v-if="insertOrderType == 1 || insertOrderType == 3"
  87. :label-width="formLabelWidth"
  88. >
  89. <el-input
  90. v-model.trim="form.userId"
  91. :disabled="!isAdd"
  92. placeholder="请输入学员编号"
  93. ></el-input>
  94. </el-form-item>
  95. <div class="lookTitle">交易信息</div>
  96. <el-form-item
  97. label="交易流水号"
  98. :rules="[
  99. { required: true, message: '请输入流水号', trigger: 'change' },
  100. ]"
  101. prop="transNo"
  102. :label-width="formLabelWidth"
  103. >
  104. <el-input
  105. placeholder="请输入交易流水号"
  106. type="text"
  107. :disabled="!isAdd"
  108. v-model.trim="form.transNo"
  109. ></el-input>
  110. </el-form-item>
  111. <el-form-item
  112. label="收款账户"
  113. prop="merNo"
  114. :rules="[
  115. { required: true, message: '请输入收款账户', trigger: 'change' },
  116. ]"
  117. :label-width="formLabelWidth"
  118. >
  119. <el-input
  120. placeholder="请输入收款账户"
  121. type="text"
  122. :disabled="!isAdd"
  123. v-model.trim="form.merNo"
  124. ></el-input>
  125. </el-form-item>
  126. <el-form-item
  127. label="交易日期"
  128. :rules="[
  129. { required: true, message: '请选择交易日期', trigger: 'change' },
  130. ]"
  131. prop="payTime"
  132. :label-width="formLabelWidth"
  133. >
  134. <el-date-picker
  135. style="width: 100%"
  136. :disabled="!isAdd"
  137. v-model="form.payTime"
  138. type="datetime"
  139. format="yyyy-MM-dd HH:mm:ss"
  140. value-format="yyyy-MM-dd HH:mm:ss"
  141. placeholder="选择交易日期"
  142. >
  143. </el-date-picker>
  144. </el-form-item>
  145. <el-form-item
  146. label="收入类型"
  147. :label-width="formLabelWidth"
  148. :rules="[
  149. { required: true, message: '请选收入类型', trigger: 'change' },
  150. ]"
  151. prop="applyType"
  152. >
  153. <el-select
  154. class="multiple"
  155. style="width: 100% !important"
  156. v-model.trim="form.applyType"
  157. filterable
  158. clearable
  159. :disabled="!isAdd"
  160. placeholder="请选择收入类型"
  161. >
  162. <el-option
  163. v-for="(item, index) in orderServerList"
  164. :key="index"
  165. :label="item.label"
  166. :value="item.value"
  167. ></el-option>
  168. </el-select>
  169. </el-form-item>
  170. <el-form-item
  171. label="销售金额"
  172. prop="saleAmount"
  173. :rules="[
  174. { required: true, message: '请输入销售金额', trigger: 'change' },
  175. ]"
  176. v-if="form.applyType == 'SELL'"
  177. :label-width="formLabelWidth"
  178. >
  179. <el-input
  180. v-model="form.saleAmount"
  181. @mousewheel.native.prevent
  182. type="number"
  183. :disabled="!isAdd"
  184. placeholder="请输入销售金额"
  185. />
  186. </el-form-item>
  187. <el-form-item
  188. label="服务金额"
  189. v-if="form.applyType == 'SERVICE'"
  190. :rules="[
  191. { required: true, message: '请输入服务金额', trigger: 'change' },
  192. ]"
  193. prop="serviceAmount"
  194. :label-width="formLabelWidth"
  195. >
  196. <el-input
  197. type="number"
  198. @mousewheel.native.prevent
  199. :disabled="!isAdd"
  200. v-model="form.serviceAmount"
  201. placeholder="请输入收入金额"
  202. />
  203. </el-form-item>
  204. <div v-if="form.applyType == 'SELL'">
  205. <div
  206. v-for="(goodsList, index) in form.goodsList"
  207. :key="index"
  208. class="shopListWrap"
  209. >
  210. <el-form-item
  211. :label="'商品名称' + (index + 1)"
  212. :label-width="formLabelWidth"
  213. class="setWidth"
  214. :prop="'goodsList.' + index + '.id'"
  215. :rules="[
  216. { required: true, message: '请选择商品', trigger: 'change' },
  217. ]"
  218. >
  219. <el-select
  220. v-if="isAdd"
  221. v-model.trim="goodsList.id"
  222. filterable
  223. :disabled="!isAdd"
  224. placeholder="请选择商品"
  225. :popper-append-to-body="false"
  226. >
  227. <el-option
  228. :title="item.name"
  229. v-for="(item, index) in shopList"
  230. :key="index"
  231. :label="item.name"
  232. :value="item.id"
  233. ></el-option>
  234. </el-select>
  235. <p class="showShop" v-else>
  236. <Tooltip :content="goodsList.id | filterShopId" />
  237. </p>
  238. </el-form-item>
  239. <el-form-item
  240. class="setWidth"
  241. style="margin-right: 10px;margin-left: 10px;"
  242. :prop="'goodsList.' + index + '.number'"
  243. >
  244. <!-- :rules="validAmount" <el-input-number style="width: 160px;" v-model="goodsList.number" placeholder="商品数量"></el-input-number> -->
  245. <el-input
  246. type="age"
  247. style="width: 160px"
  248. :disabled="!isAdd"
  249. clearable
  250. placeholder="请输入商品数量"
  251. @mousewheel.native.prevent
  252. v-model.number="goodsList.number"
  253. ></el-input>
  254. </el-form-item>
  255. <el-button
  256. icon="el-icon-minus"
  257. :disabled="!isAdd"
  258. v-if="form.goodsList.length > 1 && auditStatus == 'REJECT'"
  259. style="margin-bottom: 22px;"
  260. circle
  261. @click.prevent="removeGoodsList(goodsList)"
  262. ></el-button>
  263. <el-button
  264. icon="el-icon-plus"
  265. :disabled="!isAdd"
  266. v-if="auditStatus == 'REJECT'"
  267. @click.prevent="addGoodsList"
  268. circle
  269. style="margin-left: 5px; margin-bottom: 22px;"
  270. ></el-button>
  271. </div>
  272. </div>
  273. <div class="lookTitle">其它</div>
  274. <el-form-item
  275. label="提交备注"
  276. :label-width="formLabelWidth"
  277. :rules="[
  278. { required: true, message: '请输入提交备注', trigger: 'change' },
  279. ]"
  280. >
  281. <el-input
  282. placeholder="请输入备注"
  283. :disabled="!isAdd"
  284. v-model.trim="form.memo"
  285. type="textarea"
  286. :rows="3"
  287. ></el-input>
  288. </el-form-item>
  289. <!-- &&auditStatus != 'REJECT' -->
  290. <el-form-item
  291. label="审核备注"
  292. v-if="auditStatus != 'ING'"
  293. :label-width="formLabelWidth"
  294. >
  295. <el-input
  296. placeholder="请输入备注"
  297. :disabled="true"
  298. v-model.trim="form.auditComment"
  299. type="textarea"
  300. :rows="3"
  301. ></el-input>
  302. </el-form-item>
  303. </el-form>
  304. <div
  305. class="lookTitle"
  306. v-if="auditStatus == 'ING'"
  307. >
  308. 审核意见
  309. </div>
  310. <el-form
  311. :model="submitForm"
  312. v-if="auditStatus == 'ING'"
  313. ref="submitForm"
  314. >
  315. <el-form-item
  316. prop="memo"
  317. :rules="[
  318. { required: true, message: '请输入审核意见', trigger: 'blur' },
  319. ]"
  320. >
  321. <el-input
  322. type="textarea"
  323. :rows="4"
  324. v-model="submitForm.memo"
  325. ></el-input>
  326. </el-form-item>
  327. </el-form>
  328. </div>
  329. </template>
  330. <script>
  331. import {
  332. getRouteOrderInfo,
  333. auditOutOrder,
  334. updateRouteOrder,
  335. } from "@/api/orderManager";
  336. import { orderServerList } from "@/utils/searchArray";
  337. import { getCooperation } from "@/api/buildTeam";
  338. import Tooltip from "@/components/Tooltip/index";
  339. let that;
  340. export default {
  341. components: { Tooltip },
  342. props: ["orderId", "shopList", "isLook"],
  343. data() {
  344. return {
  345. formLabelWidth: "100px",
  346. form: {
  347. routeOrganId: null,
  348. transNo: null,
  349. type: "OTHER",
  350. merNo: null,
  351. actualAmount: null,
  352. memo: null,
  353. payTime: null,
  354. serviceAmount: null,
  355. goodsAmount: null,
  356. schoolId: null,
  357. goodsList: [
  358. {
  359. id: null,
  360. number: null,
  361. },
  362. ],
  363. applyType: null,
  364. userId: "",
  365. auditComment: "",
  366. calenderId: "",
  367. },
  368. isAdd: !this.isLook,
  369. insertOrderType: 1, // 订单类型 1 个人订单 2 学校订单 2 其它订单
  370. cooperationList: [],
  371. submitForm: {
  372. memo: "",
  373. },
  374. auditStatus: "",
  375. orderServerList: orderServerList,
  376. clearSchool: false,
  377. };
  378. },
  379. created() {
  380. that = this;
  381. },
  382. mounted() {
  383. if (this.orderId) {
  384. getRouteOrderInfo({ id: this.orderId }).then((res) => {
  385. if (res.code == 200) {
  386. let orderInfo = res.data;
  387. this.form = {
  388. createTime: orderInfo.createTime,
  389. operator: orderInfo.operator,
  390. routeOrganId: orderInfo.routeOrganId,
  391. transNo: orderInfo.transNo,
  392. type: "OTHER",
  393. merNo: orderInfo.merNo,
  394. actualAmount: orderInfo.actualAmount,
  395. memo: orderInfo.memo,
  396. payTime: orderInfo.payTime,
  397. serviceAmount: orderInfo.serviceAmount,
  398. saleAmount: orderInfo.saleAmount,
  399. schoolId: orderInfo.schoolId,
  400. userId: orderInfo.userId ? orderInfo.userId : "",
  401. auditComment: orderInfo.auditComment,
  402. applyType: orderInfo.saleAmount ? "SELL" : "SERVICE",
  403. calenderId: orderInfo.calenderId ? orderInfo.calenderId : "",
  404. };
  405. this.auditStatus = orderInfo.auditStatus;
  406. this.$set(
  407. this.form,
  408. "goodsList",
  409. this.getShopList(orderInfo.goodsJson)
  410. );
  411. this.changeOrgin(orderInfo.routeOrganId);
  412. if(orderInfo.userId && !res.data.calenderId) {
  413. this.insertOrderType = 1
  414. } else if(res.data.calenderId && !orderInfo.userId) {
  415. this.insertOrderType = 2
  416. } else {
  417. this.insertOrderType = 3
  418. }
  419. // 添加类型判断
  420. // SCHOOL("SCHOOL", "学校订单"),
  421. // PERSONAL("PERSONAL", "个人订单"),
  422. // OTHER("OTHER", "其他")
  423. if(orderInfo.type !== 'OUTORDER'){
  424. if(orderInfo.type === 'OTHER') {
  425. this.insertOrderType = 3
  426. } else if(orderInfo.type === 'SCHOOL') {
  427. this.insertOrderType = 2
  428. } else if(orderInfo.type === 'PERSONAL') {
  429. this.insertOrderType = 1
  430. }
  431. }
  432. this.clearSchool = true;
  433. }
  434. });
  435. }
  436. // 获取分部
  437. this.$store.dispatch("setBranchs");
  438. },
  439. methods: {
  440. changeOrgin(val) {
  441. if (val) {
  442. if (this.clearSchool) {
  443. this.$set(this.form, "schoolId", null);
  444. }
  445. getCooperation({ rows: 9999, organId: val }).then((res) => {
  446. if (res.code === 200) {
  447. this.cooperationList = res.data.rows;
  448. }
  449. });
  450. }
  451. },
  452. getShopList(str) {
  453. let arr = [];
  454. try {
  455. const obj = JSON.parse(str);
  456. // id: item.goodsId, number: item.num
  457. for (let i in obj) {
  458. arr.push({ id: parseInt(i), number: obj[i] });
  459. }
  460. } catch {}
  461. return arr.length > 0
  462. ? arr
  463. : [
  464. {
  465. id: null,
  466. number: null,
  467. },
  468. ];
  469. },
  470. auditOutOrder(status) {
  471. const that = this;
  472. this.$refs.submitForm.validate((res) => {
  473. if (res) {
  474. auditOutOrder({
  475. auditStatus: status,
  476. memo: this.submitForm.memo,
  477. studentPaymentRouteOrderId: this.orderId,
  478. }).then((res) => {
  479. if (res.code == 200) {
  480. this.$message.success("审核成功");
  481. that.$emit("getList");
  482. return;
  483. }
  484. });
  485. }
  486. });
  487. },
  488. removeGoodsList(item) {
  489. const index = this.form.goodsList.indexOf(item);
  490. if (index !== -1) {
  491. this.form.goodsList.splice(index, 1);
  492. }
  493. },
  494. addGoodsList() {
  495. this.form.goodsList.push({
  496. id: null,
  497. number: null,
  498. });
  499. },
  500. submitReaet() {
  501. this.$refs.ruleForm.validate((valid) => {
  502. if (valid) {
  503. let form = JSON.parse(JSON.stringify(this.form));
  504. if (!form.saleAmount && !form.serviceAmount) {
  505. this.$message.error("请输入销售收入或服务收入");
  506. return;
  507. }
  508. form.applyType == "SELL"
  509. ? (form.serviceAmount = 0)
  510. : (form.saleAmount = 0);
  511. if (!form.saleAmount) {
  512. form.goodsList = null;
  513. }
  514. let goodsJson = {};
  515. for (let i in form.goodsList) {
  516. goodsJson[form.goodsList[i]["id"]] = form.goodsList[i]["number"];
  517. }
  518. form.goodsJson =
  519. form.applyType == "SERVICE" ? null : JSON.stringify(goodsJson);
  520. form.id = this.orderId;
  521. form.auditStatus = "ING";
  522. if(this.insertOrderType == 1) {
  523. form.calenderId = null
  524. } else if(this.insertOrderType == 2) {
  525. form.userId = null
  526. }
  527. updateRouteOrder(form).then((res) => {
  528. if (res.code == 200) {
  529. this.$message.success("修改成功");
  530. this.$emit("getList");
  531. return;
  532. } else {
  533. this.$message.error(res.msg);
  534. }
  535. });
  536. }
  537. });
  538. },
  539. },
  540. filters: {
  541. filterShopId(val) {
  542. let str = "";
  543. that.shopList.forEach((shop) => {
  544. if (shop.id == val) {
  545. str = shop.name;
  546. }
  547. });
  548. return str;
  549. },
  550. },
  551. };
  552. </script>
  553. <style lang="scss" scoped>
  554. .lookTitle {
  555. height: 40px;
  556. line-height: 40px;
  557. font-weight: bold;
  558. background-color: rgb(237, 238, 240);
  559. padding: 0 20px;
  560. margin-bottom: 20px;
  561. }
  562. .setWidth {
  563. display: inline-block;
  564. }
  565. .showShop {
  566. height: 40px;
  567. line-height: 40px;
  568. width: 150px;
  569. background-color: #f5f7fa;
  570. border-color: #e4e7ed;
  571. color: #c0c4cc;
  572. cursor: not-allowed;
  573. color: #333;
  574. opacity: 1;
  575. border-radius: 4px;
  576. border: 1px solid #dcdfe6;
  577. padding: 0 15px;
  578. margin-right: 10px;
  579. }
  580. .shopListWrap { display: flex; flex-direction: row; justify-content: flex-start;}
  581. </style>