expendMxDetail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. <template>
  2. <div id="editExpendMx">
  3. <el-card style="position: relative">
  4. <span>基本信息</span>
  5. <el-form
  6. :model="basicForm"
  7. :rules="basicRules"
  8. ref="basic"
  9. label-width="auto"
  10. :show-message="false"
  11. >
  12. <el-row :gutter="10">
  13. <el-col :span="1.5">
  14. <el-form-item label="编码" prop="code">
  15. <el-input
  16. style="width: 200px"
  17. clearable
  18. disabled
  19. :size="size"
  20. v-model="basicForm.code"
  21. >
  22. </el-input>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="1.5">
  26. <el-form-item label="服务费合计" prop="serviceFee">
  27. <el-input-number
  28. style="width: 200px"
  29. clearable
  30. disabled
  31. v-model="publishedBooksMessage"
  32. :size="size"
  33. :precision="2"
  34. >
  35. <!-- <el-input style="width: 200px" clearable disabled :size="size" v-model="basicForm.serviceFee"> -->
  36. </el-input-number>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="1.5">
  40. <el-form-item label="医院编码" prop="custCode">
  41. <el-input
  42. style="width: 200px"
  43. clearable
  44. :disabled="sonDisable"
  45. :size="size"
  46. v-model="basicForm.custCode"
  47. >
  48. </el-input>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="1.5">
  52. <el-form-item label="医院名称" prop="custName">
  53. <el-input
  54. style="width: 200px"
  55. clearable
  56. :disabled="sonDisable"
  57. :size="size"
  58. v-model="basicForm.custName"
  59. >
  60. </el-input>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="1.5">
  64. <el-form-item label="供应商编码" prop="supplierCode">
  65. <el-input
  66. style="width: 200px"
  67. clearable
  68. :disabled="sonDisable"
  69. :size="size"
  70. v-model="basicForm.supplierCode"
  71. >
  72. </el-input>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="1.5">
  76. <el-form-item label="供应商名称" prop="supplierName">
  77. <el-input
  78. style="width: 200px"
  79. clearable
  80. :disabled="sonDisable"
  81. :size="size"
  82. v-model="basicForm.supplierName"
  83. >
  84. </el-input>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="1.5">
  88. <el-form-item label="结算单号" prop="settleNo">
  89. <el-input
  90. style="width: 200px"
  91. clearable
  92. :disabled="sonDisable"
  93. :size="size"
  94. v-model="basicForm.settleNo"
  95. >
  96. </el-input>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="1.5">
  100. <el-form-item label="结算开始日期" prop="startDate">
  101. <el-date-picker
  102. v-model="basicForm.startDate"
  103. :disabled="sonDisable"
  104. clearable
  105. type="date"
  106. value-format="yyyy-MM-dd"
  107. :size="size"
  108. style="width: 200px"
  109. >
  110. </el-date-picker>
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="1.5">
  114. <el-form-item label="结算截止日期" prop="endDate">
  115. <el-date-picker
  116. v-model="basicForm.endDate"
  117. :disabled="sonDisable"
  118. clearable
  119. type="date"
  120. value-format="yyyy-MM-dd"
  121. :size="size"
  122. style="width: 200px"
  123. >
  124. </el-date-picker>
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="1.5">
  128. <el-form-item label="合计金额" prop="totalAmount">
  129. <el-input-number
  130. style="width: 200px"
  131. clearable
  132. disabled
  133. v-model="publishedBooksMessage2"
  134. :size="size"
  135. :precision="2"
  136. >
  137. </el-input-number>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="1.5">
  141. <el-form-item label="是否汇总" prop="isSum">
  142. <el-select
  143. style="width: 200px"
  144. :size="size"
  145. :disabled="true"
  146. clearable
  147. v-model="basicForm.isSum"
  148. placeholder="请选择"
  149. >
  150. <el-option
  151. v-for="item in options"
  152. :key="item.value"
  153. :label="item.label"
  154. :value="item.value"
  155. >
  156. </el-option>
  157. </el-select>
  158. </el-form-item>
  159. </el-col>
  160. <el-col :span="1.5">
  161. <el-form-item label="汇总单据号" prop="sumCode">
  162. <el-input
  163. style="width: 200px"
  164. disabled
  165. :size="size"
  166. v-model="basicForm.sumCode"
  167. >
  168. </el-input>
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="1.5">
  172. <el-form-item label="是否带量" prop="isWhether">
  173. <el-select
  174. style="width: 200px"
  175. :size="size"
  176. :disabled="sonDisable"
  177. clearable
  178. v-model="basicForm.isWhether"
  179. placeholder="请选择"
  180. >
  181. <el-option
  182. v-for="item in options1"
  183. :key="item.value"
  184. :label="item.label"
  185. :value="item.value"
  186. >
  187. </el-option>
  188. </el-select>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="1.5">
  192. <el-form-item label="备注" prop="remark">
  193. <el-input
  194. style="width: 200px"
  195. clearable
  196. :disabled="sonDisable"
  197. :size="size"
  198. v-model="basicForm.remark"
  199. >
  200. </el-input>
  201. </el-form-item>
  202. </el-col>
  203. </el-row>
  204. </el-form>
  205. <div class="btn_group">
  206. <!-- <el-button type="primary" :size="size" @click="toOA" v-if="sonPageStu == 'check'">提交</el-button> -->
  207. <el-button
  208. type="primary"
  209. :size="size"
  210. @click="editPage"
  211. v-if="sonPageStu == 'check'"
  212. >编辑</el-button
  213. >
  214. <el-button
  215. type="primary"
  216. :size="size"
  217. @click="save"
  218. v-if="sonPageStu == 'add' || sonPageStu == 'edit'"
  219. >保存</el-button
  220. >
  221. <el-button :size="size" plain @click="back">返回</el-button>
  222. </div>
  223. <div class="btn_grooup">
  224. <span>明细信息</span>
  225. <div>
  226. <el-button
  227. type="primary"
  228. :size="size"
  229. @click="editLine"
  230. v-if="!sonDisable"
  231. >批量修改</el-button
  232. >
  233. <el-button
  234. v-if="sonPageStu == 'check'"
  235. :size="size"
  236. :disabled="!(basicForm.isSum == '0' && (basicForm.sumCode == null || basicForm.sumCode == ''))"
  237. @click="cancelDisassembly"
  238. >取消拆单</el-button
  239. >
  240. <el-button
  241. v-if="sonPageStu == 'check'"
  242. :size="size"
  243. :disabled="!ids.length"
  244. @click="useDisassembly"
  245. >拆 单</el-button
  246. >
  247. <!-- <el-button type="primary" :size="size" @click="delLines" v-if="!sonDisable">删行</el-button> -->
  248. </div>
  249. </div>
  250. <el-dialog
  251. title="批量修改"
  252. @close="clearInfo"
  253. :visible.sync="dialogFormVisible"
  254. >
  255. <el-form :model="dialogForm" label-width="auto">
  256. <el-form-item label="明细信息">
  257. <el-select :size="size" v-model="dialogForm.region">
  258. <el-option label="服务费率" value="ratio"></el-option>
  259. <el-option label="单价" value="price"></el-option>
  260. </el-select>
  261. </el-form-item>
  262. <el-form-item label="修改值">
  263. <el-input-number
  264. clearable
  265. :size="size"
  266. :min="0"
  267. v-model="dialogForm.info"
  268. ></el-input-number>
  269. </el-form-item>
  270. </el-form>
  271. <div slot="footer" class="dialog-footer">
  272. <el-button :size="size" @click="dialogFormVisible = false"
  273. >取 消</el-button
  274. >
  275. <el-button :size="size" type="primary" @click="confirm"
  276. >确 定</el-button
  277. >
  278. </div>
  279. </el-dialog>
  280. <ux-grid
  281. :data="basicForm.itemList"
  282. border
  283. :cell-style="{ borderColor: '#c0c0c0' }"
  284. :header-cell-style="{ borderColor: '#c0c0c0' }"
  285. class="exporttable"
  286. height="410"
  287. max-height="410"
  288. style="font-size: 12px"
  289. @selection-change="handleSelectionChange"
  290. ref="table"
  291. show-header-overflow="tooltip"
  292. show-overflow="tooltip"
  293. keep-source
  294. beautifyTable
  295. :checkbox-config="{ highlight: true, trigger: 'row' }"
  296. :edit-config="{ trigger: 'click', mode: 'row'}"
  297. >
  298. >
  299. <ux-table-column resizable type="checkbox" width="50px" fixed="left" />
  300. <ux-table-column
  301. resizable
  302. title="医保编码"
  303. field="healthCode"
  304. align="center"
  305. />
  306. <ux-table-column
  307. resizable
  308. title="拆单数量"
  309. field="divideNum"
  310. align="center"
  311. edit-render
  312. >
  313. <template v-slot:edit="scope">
  314. <span @click.stop>
  315. <el-input-number
  316. :disabled="!ids.length"
  317. :min="1"
  318. :max="Number(scope.row.qty)"
  319. :size="size"
  320. v-model="scope.row.divideNum"
  321. />
  322. </span>
  323. </template>
  324. </ux-table-column>
  325. <ux-table-column
  326. resizable
  327. title="物料编码"
  328. field="itemCode"
  329. align="center"
  330. />
  331. <ux-table-column
  332. resizable
  333. title="物料名称"
  334. field="itemName"
  335. align="center"
  336. />
  337. <ux-table-column
  338. resizable
  339. title="规格型号"
  340. field="itemSpec"
  341. align="center"
  342. />
  343. <ux-table-column
  344. resizable
  345. title="厂家"
  346. field="manufactor"
  347. align="center"
  348. />
  349. <ux-table-column
  350. resizable
  351. title="单位"
  352. field="itemUom"
  353. align="center"
  354. />
  355. <ux-table-column
  356. resizable
  357. title="是否带量"
  358. field="isWhether"
  359. align="center"
  360. :formatter="hangStatus"
  361. />
  362. <ux-table-column
  363. resizable
  364. title="服务费率(%)"
  365. field="ratio"
  366. align="center"
  367. edit-render
  368. >
  369. <template v-slot:edit="scope">
  370. <el-input-number
  371. clearable
  372. :disabled="sonDisable"
  373. :min="0"
  374. :size="size"
  375. v-model="scope.row.ratio"
  376. @input="changeFei(scope.rowIndex, scope.row)"
  377. />
  378. </template>
  379. </ux-table-column>
  380. <ux-table-column resizable title="数量" field="qty" align="center" />
  381. <ux-table-column
  382. resizable
  383. title="单价"
  384. field="price"
  385. align="center"
  386. edit-render
  387. >
  388. <template v-slot:edit="scope">
  389. <el-input-number
  390. clearable
  391. :disabled="sonDisable"
  392. :min="1"
  393. :size="size"
  394. v-model="scope.row.price"
  395. @input="changeFei(scope.rowIndex, scope.row)"
  396. />
  397. </template>
  398. </ux-table-column>
  399. <ux-table-column resizable title="小计" field="amount" align="center" />
  400. <ux-table-column
  401. resizable
  402. title="备注"
  403. field="detailRemark"
  404. align="center"
  405. />
  406. <ux-table-column
  407. resizable
  408. title="服务费"
  409. field="serviceFee"
  410. align="center"
  411. />
  412. </ux-grid>
  413. </el-card>
  414. </div>
  415. </template>
  416. <script>
  417. import {
  418. Mxdetail,
  419. editSaveMx,
  420. toOAs,
  421. divideDoc,
  422. cancelDoc,
  423. } from "@/api/expend/expendMx.js";
  424. export default {
  425. props: ["pageStu", "row", "disable"],
  426. model: {
  427. prop: "isList",
  428. event: "jugislist",
  429. },
  430. data() {
  431. return {
  432. size: "mini",
  433. // 不能直接改变props传来的值
  434. sonPageStu: this.pageStu,
  435. sonDisable: this.disable,
  436. basicForm: {
  437. id: "",
  438. code: "",
  439. serviceFee: 0,
  440. custCode: "",
  441. custName: "",
  442. supplierCode: "",
  443. supplierName: "",
  444. settleNo: "",
  445. startDate: "",
  446. endDate: "",
  447. totalAmount: "",
  448. isSum: "",
  449. sumCode: "",
  450. isWhether: "",
  451. remark: "",
  452. itemList: [],
  453. },
  454. options: [
  455. { value: "0", label: "是" },
  456. { value: "2", label: "否" },
  457. ],
  458. options1: [
  459. { value: "0", label: "否" },
  460. { value: "1", label: "是" },
  461. ],
  462. basicRules: {},
  463. ids: [],
  464. dialogFormVisible: false,
  465. dialogForm: {
  466. region: "ratio",
  467. info: "",
  468. },
  469. };
  470. },
  471. created() {
  472. if (this.pageStu == "check") {
  473. // console.log("数据", this.row);
  474. this.getDetails(this.row);
  475. } else if (this.pageStu == "edit") {
  476. this.getDetails(this.row);
  477. } else if (this.pageStu == "add") {
  478. }
  479. },
  480. computed: {
  481. // 一个计算属性的 getter
  482. publishedBooksMessage: {
  483. get() {
  484. this.basicForm.serviceFee = this.basicForm.itemList.reduce(
  485. (sum, item) => {
  486. return (Math.round((sum += item.ratio * 0.01 * item.amount) * 10000) / 10000);
  487. },
  488. 0
  489. );
  490. return this.basicForm.serviceFee;
  491. },
  492. set() {},
  493. },
  494. publishedBooksMessage2: {
  495. get() {
  496. this.basicForm.totalAmount = this.basicForm.itemList.reduce(
  497. (sum, item) => {
  498. return (Math.round((sum += item.qty * item.price) * 10000) / 10000);
  499. },
  500. 0
  501. );
  502. return this.basicForm.totalAmount;
  503. },
  504. set() {},
  505. },
  506. },
  507. methods: {
  508. getToFixed(prop, val = 2) {
  509. return Number(prop.toFixed(val));
  510. },
  511. getDetails(row) {
  512. Mxdetail(row.id).then((res) => {
  513. if (res.code === 200) {
  514. this.basicForm = res.data;
  515. this.basicForm.itemList.forEach(item => {
  516. item.divideNum = Number(item.qty)
  517. })
  518. }
  519. });
  520. },
  521. editPage() {
  522. this.sonPageStu = "edit";
  523. this.sonDisable = false;
  524. },
  525. save() {
  526. editSaveMx(this.basicForm).then((res) => {
  527. if (res.code === 200) {
  528. this.$modal.notifySuccess("编辑保存成功");
  529. this.sonPageStu = "check";
  530. this.sonDisable = true;
  531. this.getDetails(this.row);
  532. this.ids = [];
  533. }
  534. });
  535. },
  536. back() {
  537. this.$emit("jugislist", true);
  538. this.$emit("refresh");
  539. },
  540. handleSelectionChange(selection) {
  541. // this.ids = selection.map(item =>{
  542. // return item.id
  543. // })
  544. console.log('selection', selection)
  545. let lin = selection.map(item => { return item.id })
  546. console.log('lin',lin)
  547. this.basicForm.itemList.forEach(item => {
  548. if(!lin.includes(item.id)) {
  549. item.divideNum = Number(item.qty)
  550. }
  551. })
  552. // selection.forEach(item => {
  553. // item.divideNum = Number(item.qty)
  554. // })
  555. this.ids = selection;
  556. },
  557. editLine() {
  558. if (this.ids.length <= 0) {
  559. this.$modal.notifyWarning("请至少选择一条数据进行操作!");
  560. } else {
  561. this.dialogFormVisible = true;
  562. }
  563. },
  564. // 取消拆单
  565. cancelDisassembly() {
  566. cancelDoc(this.basicForm.code).then(res => {
  567. if(res.code === 200) {
  568. this.$modal.notifySuccess("取消拆单成功");
  569. this.back()
  570. }
  571. })
  572. },
  573. // 拆单
  574. async useDisassembly() {
  575. try {
  576. let ids = this.ids.map((item) => item.id);
  577. let tableLit = _.cloneDeep(this.basicForm.itemList);
  578. tableLit = tableLit.map((item) => {
  579. let index = ids.findIndex((i) => i === item.id);
  580. if (index !== -1) {
  581. item.isWhether = "1";
  582. }
  583. return item;
  584. });
  585. let { code, msg } = await divideDoc({
  586. ...this.basicForm,
  587. itemList: tableLit,
  588. });
  589. if (code === 200) {
  590. this.$notify.success(msg);
  591. this.back();
  592. }
  593. } catch (error) {}
  594. },
  595. confirm() {
  596. console.log("修改值", this.dialogForm);
  597. this.ids.forEach((item) => {
  598. item[this.dialogForm.region] = this.dialogForm.info;
  599. // 小计 = 数量 * 单价
  600. item.amount = item.qty * item.price;
  601. item.serviceFee = (item.ratio * 0.01 * item.amount).toFixed(2);
  602. });
  603. this.dialogFormVisible = false;
  604. },
  605. clearInfo() {
  606. this.dialogForm = {
  607. region: "ratio",
  608. info: "",
  609. };
  610. },
  611. delLines() {},
  612. toOA() {
  613. this.$modal.loading("正在提交,请稍后...");
  614. toOAs(this.basicForm)
  615. .then((res) => {
  616. if (res.code === 200) {
  617. this.$modal.closeLoading();
  618. this.$modal.notifySuccess(res.msg);
  619. this.back();
  620. }
  621. })
  622. .catch((err) => {
  623. this.$modal.closeLoading();
  624. });
  625. },
  626. changeFei(index, row) {
  627. row.amount = row.qty * row.price;
  628. row.serviceFee = (row.ratio * 0.01 * row.amount).toFixed(2);
  629. // this.basicForm.serviceFee = this.basicForm.itemList.map(item => {
  630. // return item.serviceFee += item.serviceFee
  631. // })
  632. },
  633. hangStatus(row) {
  634. switch (row.row.isWhether) {
  635. case "0":
  636. return "否";
  637. case "":
  638. return "否";
  639. case "1":
  640. return "是";
  641. }
  642. },
  643. },
  644. };
  645. </script>
  646. <style lang="scss" scoped>
  647. .btn_group {
  648. display: flex;
  649. justify-content: space-between;
  650. position: absolute;
  651. top: 10px;
  652. right: 20px;
  653. }
  654. .btn_grooup {
  655. margin-bottom: 10px;
  656. display: flex;
  657. justify-content: space-between;
  658. }
  659. </style>