orderAuditDetail.vue 15 KB

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