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.

832 lines
28 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div style="display: flex;">
  3. <div :style="'display: flex;width:' + (window.pageWidth - 45 - 110) + 'px;'">
  4. <!--未选组合项目-->
  5. <div style="display: block; width:230px;">
  6. <div>
  7. <span>项目类别</span>
  8. <el-cascader :options="dict.itemTypeTree" v-model="itemTypeIds" style="margin-left: 3px;width:160px;"
  9. :props="{ checkStrictly: true, expandTrigger: 'hover', ...customerOrg.treeprops, }" :show-all-levels="false"
  10. clearable filterable @change="getAsbItemByItemType" size="small">
  11. </el-cascader>
  12. </div>
  13. <div class="box">
  14. <el-table :data="dict.asbItem" border size="small" highlight-current-row
  15. :height="window.pageHeight < 635 ? 200:(window.pageHeight - 110 - 325)"
  16. @row-dblclick="dbClickChoosedAsb" row-key="id"
  17. @selection-change="handleSelectionChange" :row-class-name="handleRowClassName"
  18. @row-click="chooseAsbItem">
  19. <!--
  20. <el-table-column type="selection" align="center" ></el-table-column>
  21. -->
  22. <el-table-column type="index" align="center" min-width="40"/>
  23. <el-table-column
  24. label="未选组合项目" min-width="170"
  25. prop="displayName" align="center"
  26. ></el-table-column>
  27. </el-table>
  28. </div>
  29. </div>
  30. <!--中间操作按钮-->
  31. <div style="display: block;margin: 40px 10px 0 10px;">
  32. <div>
  33. <el-button class="btnClass" @click="addAbs(asbItemChoosed,'choosed')" >添加 <i class="el-icon-arrow-right"></i></el-button>
  34. </div>
  35. <div>
  36. <el-button class="btnClass" @click="addAbs(asbItemChoosed,'all')">全部添加</el-button>
  37. </div>
  38. <div>
  39. <el-button class="btnClass"
  40. @click="delAbs(patientRegisterAbsChoosed,'choosed')">移除 <i class="el-icon-arrow-left"></i
  41. ></el-button>
  42. </div>
  43. <div>
  44. <el-button class="btnClass" @click="delAbs(patientRegisterAbsChoosed,'all')">全部移除</el-button>
  45. </div>
  46. </div>
  47. <!--已选组合项目-->
  48. <div :style="'display: block; width:' + (window.pageWidth - 230 - 120 - 45 - 110) + 'px;'">
  49. <div style="height:32px;">
  50. <span>快速选择</span>
  51. <el-select v-model="asbItemId" placeholder="快速选择组合项目" size="small"
  52. filterable default-first-option :filter-method="filterMethod"
  53. clearable @clear="quickAsb = deepCopy(dict.asbItemQuick)"
  54. @change="quickChoosedAsb" ref="quickAsbOCX"
  55. style="margin-left: 3px;width:160px;">
  56. <el-option v-for="item in quickAsb" :key="item.id" :value="item.id" :label="item.displayName" />
  57. </el-select>
  58. </div>
  59. <div class="box">
  60. <el-table :data="medicalPackageAsbitems" border size="small"
  61. @selection-change="selecteditems" highlight-current-row
  62. :height="window.pageHeight < 635 ? 200:(window.pageHeight - 110 - 325)"
  63. :summary-method="getSummaries" show-summary
  64. :row-class-name="handleRowClassName" @row-dblclick="removeAbs"
  65. @row-click="removeAsbItem" ref="tablemedicalPackageAsbitems">
  66. <!--
  67. <el-table-column type="selection"></el-table-column>
  68. -->
  69. <el-table-column type="index" min-width="40" align="center"/>
  70. <el-table-column
  71. label="已选组合项目"
  72. min-width="120"
  73. prop="displayName"
  74. ></el-table-column>
  75. <el-table-column label="标准价格" prop="price" min-width="60" align="center"/>
  76. <el-table-column label="折扣" min-width="60" align="center">
  77. <template slot-scope="scope">
  78. <el-input
  79. @input="changeDiscount(scope.$index)"
  80. type="number" size="small"
  81. v-model="scope.row.discount"
  82. />
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="应收价格" prop="medicalPackageDetailPrice" min-width="60" align="center">
  86. <template slot-scope="scope">
  87. <el-input
  88. @input="changePrices(scope.$index)"
  89. type="number" size="small"
  90. v-model="scope.row.medicalPackageDetailPrice"
  91. />
  92. </template>
  93. </el-table-column>
  94. <el-table-column label="数量" prop="medicalPackageDetailAmount" min-width="40" align="center">
  95. <template slot-scope="scope">
  96. <el-input
  97. @input="changePrices(scope.$index)"
  98. type="number" size="small"
  99. v-model="scope.row.medicalPackageDetailAmount"
  100. />
  101. </template>
  102. </el-table-column>
  103. <el-table-column label="标准金额" prop="asbitemMoney" min-width="60" align="center">
  104. </el-table-column>
  105. <el-table-column label="应收金额" prop="medicalPackageDetailMoney" min-width="60" align="center">
  106. </el-table-column>
  107. </el-table>
  108. </div>
  109. </div>
  110. </div>
  111. <!--批量操作按钮复制套餐与分组-->
  112. <div style="display: block;margin-left: 10px;">
  113. <div style="margin-top: 50px;">
  114. <el-button class="btnClass" @click="btnCopyMedicalPackage">复制套餐</el-button>
  115. </div>
  116. <div>
  117. <el-button class="btnClass" @click="btnSave">保存</el-button>
  118. </div>
  119. </div>
  120. <!--复制套餐-->
  121. <el-dialog title="体检套餐" :visible.sync="medicalPackageVisble" width="600px" height="400"
  122. :show-close="false" :close-on-click-modal="false" :append-to-body="true">
  123. <el-table :data="dict.medicalPackage" border height="350" row-key="id" size="small"
  124. highlight-current-row @row-click="packageRowClick" @row-dblclick="rowDblclick" ref="patientList" >
  125. <!-- "displayName": "健康体检套餐",
  126. "price": 20.00,
  127. "forSexId": "0",
  128. "isActive": "Y",
  129. "remark": "2",
  130. "displayOrder": 1,
  131. "simpleCode": "JKTJTC",
  132. "creatorName": "admin",
  133. "lastModifierName": "users",
  134. "lastModificationTime": "2023-08-04T16:34:02.94408",
  135. "lastModifierId": "3a0ca83b-3116-da05-3916-dfd4c0c548cb",
  136. "creationTime": "2023-07-10T19:53:30.210553",
  137. "creatorId": "3a0c4180-107c-0c89-b25b-0bd34666dcec",
  138. "id": "3a0c51d3-2345-38df-ba0b-1862a3c3606f" -->
  139. <el-table-column type="index" width="50" />
  140. <el-table-column prop="displayName" label="套餐名称" width="180"/>
  141. <el-table-column prop="price" label="价格" width="80"/>
  142. <el-table-column prop="forSexId" label="适用性别" width="80">
  143. <template slot-scope="scope">
  144. <div>
  145. {{ dddw(dict.forSex, "id", scope.row.forSexId, "displayName") }}
  146. </div>
  147. </template>
  148. </el-table-column>
  149. <el-table-column prop="remark" label="备注" width="100"/>
  150. <el-table-column prop="creatorName" label="创建人员" width="80"/>
  151. <el-table-column prop="creationTime" label="创建日期" width="100">
  152. <template slot-scope="scope">
  153. <div v-if="scope.row.creationTime">
  154. {{ moment(scope.row.creationTime).format("yyyy-MM-DD") }}
  155. </div>
  156. </template>
  157. </el-table-column>
  158. <el-table-column prop="lastModifierName" label="修改人员" width="80"/>
  159. <el-table-column prop="lastModificationTime" label="修改日期" width="100">
  160. <template slot-scope="scope">
  161. <div v-if="scope.row.lastModificationTime">
  162. {{ moment(scope.row.lastModificationTime).format("yyyy-MM-DD") }}
  163. </div>
  164. </template>
  165. </el-table-column>
  166. </el-table>
  167. <span slot="footer" class="dialog-footer">
  168. <el-button @click="medicalPackageVisble = false" style="width:90px;">取消</el-button>
  169. <el-button type="primary" @click="copyMedicalPackage" style="width:90px;">确定</el-button>
  170. </span>
  171. </el-dialog>
  172. </div>
  173. </template>
  174. <script>
  175. import moment from 'moment';
  176. import { mapState } from "vuex";
  177. import { getapi, postapi, putapi } from "@/api/api";
  178. import { arrayExistObj, tcdate, arrayFilter, arrayReduce, deepCopy,dddw } from "../../utlis/proFunc";
  179. export default {
  180. props:['formData','refreshMoney'],
  181. data() {
  182. return {
  183. packagePrice:0, //分组总价
  184. medicalPackageAsbitems:[], //分组包含组合项目
  185. itemTypeIds:[], //项目类别
  186. asbItemId:'', //当前快速选到的给合项目ID
  187. quickAsb:[], //过滤显示的组合项目
  188. asbItemChoosed: [], //勾选的 未选组合项目
  189. startPoint:-1,
  190. PstartPoint:-1,
  191. medicalPackageVisble:false, //复制套餐
  192. curPackageId:'', //当前选中套餐ID
  193. packageAsbitems:[], //套餐中包含的组合项目
  194. selecteddata: [], //已选数据
  195. unselecteddata: [], //未选数据
  196. rightselctedata: [], //右侧已选
  197. options: [],
  198. value: "",
  199. dialogVisible: false,
  200. copyGroupdialogVisible: false,
  201. packagelist: [],
  202. tabledata: [],
  203. temporaryselection: [], //已选组合项目table
  204. copegroupdata: [], //复制分组
  205. addrulst: [], //添加保存的Id
  206. price: "", //价格
  207. title: 1,
  208. };
  209. },
  210. computed: {
  211. ...mapState(["window","dict","customerOrg"]),
  212. },
  213. created() {
  214. this.dictInit()
  215. },
  216. updated () {
  217. this.refreshTable('tablemedicalPackageAsbitems')
  218. },
  219. methods: {
  220. moment,dddw,deepCopy,
  221. //表格强制刷新
  222. refreshTable(tableRef){
  223. this.$nextTick(() => {
  224. this.$refs[tableRef].doLayout()
  225. })
  226. },
  227. //初始数据
  228. dictInit(){
  229. //体检类别 树结构
  230. getapi("/api/app/item-type/by-code-all").then((res) => {
  231. if (res.code != -1) {
  232. this.dict.itemTypeTree = res.data;
  233. tcdate(this.dict.itemTypeTree);
  234. }
  235. });
  236. //获取所有组合项目
  237. getapi("/api/app/asbitem/in-filter?Filter").then((res) => {
  238. if (res.code != -1) {
  239. this.dict.asbItemAll = res.data.items;
  240. this.dict.asbItemAll.forEach(e => {
  241. e.choosed = false
  242. })
  243. this.dict.asbItem = deepCopy(this.dict.asbItemAll);
  244. this.dict.asbItemQuick = deepCopy(res.data.items);
  245. this.quickAsb = deepCopy(res.data.items);
  246. }
  247. });
  248. //套餐
  249. postapi("/api/app/medicalpackage/getmedicalpackagelist",{}).then((res) => {
  250. if (res.code != -1) {
  251. this.dict.medicalPackage = res.data;
  252. }
  253. });
  254. },
  255. handleRowClassName({ row, rowIndex }) {
  256. // highLightBg 为 'selected'的高亮
  257. //console.log(rowIndex, row)
  258. //return row.highLightBg == 'selected' ? 'high-light-bg' : '';
  259. if (row.choosed) {
  260. return 'current-row';
  261. } else {
  262. return '';
  263. }
  264. },
  265. //项目类别过滤 组合项目,未过滤已选择的组合项目
  266. getAsbItemByItemTypeAll() {
  267. //console.log('getAsbItemByItemType', typeof this.itemTypeIds, this.itemTypeIds)
  268. let lv = "";
  269. if (typeof this.itemTypeIds === "object") {
  270. lv = this.itemTypeIds[this.itemTypeIds.length - 1];
  271. }
  272. if (lv) {
  273. this.dict.asbItem = arrayFilter(this.dict.asbItemAll, "itemTypeId", lv);
  274. } else {
  275. this.dict.asbItem = deepCopy(this.dict.asbItemAll);
  276. }
  277. //console.log('lv,this.dict.asbItem', lv, this.dict.asbItem)
  278. this.dict.asbItemQuick = deepCopy(this.dict.asbItemAll);
  279. },
  280. //按项目类别显示组合项目,并过滤已选择的组合项目
  281. getAsbItemByItemType() {
  282. this.getAsbItemByItemTypeAll()
  283. //刷新显示 未选组合项目
  284. arrayReduce(this.dict.asbItem, [...this.medicalPackageAsbitems], "id=asbitemId");
  285. arrayReduce(this.dict.asbItemQuick, [...this.medicalPackageAsbitems], "id=asbitemId");
  286. this.quickAsb = Object.assign(this.dict.asbItemQuick)
  287. },
  288. //快速选择组合项目时,调整可按拼间简码及简称查找
  289. filterMethod(keyWords) {
  290. //console.log('filterMethod',this.dict.asbItemQuick)
  291. if (keyWords) {
  292. this.quickAsb = [];
  293. this.dict.asbItemQuick.forEach(item => {
  294. if (item.displayName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
  295. || item.simpleCode.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
  296. || item.shortName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1) {
  297. this.quickAsb.push(item);
  298. }
  299. });
  300. } else {
  301. this.quickAsb = deepCopy(this.dict.asbItemQuick);
  302. }
  303. },
  304. // 添加组合项目
  305. ///api/app/register-asbitem/many/3fa85f64-5717-4562-b3fc-2c963f66afa6'
  306. async addAbs(asbItemChoosed,oprType) {
  307. // console.log('this.medicalPackage',this.medicalPackage)
  308. // console.log('asbItemChoosed', asbItemChoosed)
  309. if(!this.formData.id){
  310. this.$message.warning("请先选中单位分组")
  311. return
  312. }
  313. if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
  314. this.$message.warning("体检次数已完成,不允许操作")
  315. return
  316. }
  317. let message = []
  318. let checked = true
  319. let lfind = -1
  320. //oprType 不传值时,兼容勾选方式
  321. //勾选时不需要此操作 start
  322. if(oprType && oprType == 'all'){
  323. asbItemChoosed = deepCopy(this.dict.asbItem)
  324. }else if(oprType && oprType == 'choosed'){
  325. asbItemChoosed = []
  326. this.dict.asbItem.forEach(e =>{
  327. if(e.choosed){
  328. asbItemChoosed.push(e)
  329. e.choosed = false
  330. }
  331. })
  332. }
  333. //勾选时不需要此操作 end
  334. if (asbItemChoosed.length < 1) {
  335. this.$message.warning("请选择要添加的组合项目")
  336. return
  337. }
  338. //性别、年龄判断
  339. // "displayName": "身高体重",
  340. // "shortName": "哈f哈",
  341. // "forSexId": "F",
  342. // "itemTypeId": "3a0b16de-75b9-c910-c61b-844709a88940",
  343. // "price": 0,
  344. // for (let i = 0; i < asbItemChoosed.length; i++) {
  345. // if (this.formData.forSexId == 'A') break //未选性别时,无需判断组合项目性别限制
  346. // if (asbItemChoosed[i].forSexId == 'A' || asbItemChoosed[i].forSexId == 'U') continue
  347. // if (asbItemChoosed[i].forSexId != this.formData.sexId) {
  348. // this.$message.warning(`所选项目:${asbItemChoosed[i].displayName},不适合当前人员性别`)
  349. // checked = false
  350. // break
  351. // }
  352. // }
  353. // //console.log(222,checked)
  354. // if (!checked) return
  355. // 去掉重复的项目
  356. arrayReduce(asbItemChoosed, this.medicalPackageAsbitems, "id=asbitemId")
  357. for (let i = asbItemChoosed.length - 1; i > - 1; i--) {
  358. if (this.formData.forSexId == 'A') break //未选性别时,无需判断组合项目性别限制
  359. if (asbItemChoosed[i].forSexId == 'A' || asbItemChoosed[i].forSexId == 'U') continue
  360. if (asbItemChoosed[i].forSexId != this.formData.forSexId) {
  361. message.push(asbItemChoosed[i].displayName) //.warning(`所选项目:${asbItemChoosed[i].displayName},不适合当前人员性别`)
  362. checked = false
  363. asbItemChoosed.splice(i,1)
  364. }
  365. }
  366. //console.log(222,checked)
  367. if (!checked) this.$message.warning(`所选项目【${JSON.stringify(message)}】不适合当前人员性别`)
  368. for (let i = 0; i < asbItemChoosed.length; i++) {
  369. let pojo = {
  370. asbitemId: asbItemChoosed[i].id,
  371. displayName:asbItemChoosed[i].displayName,
  372. discount:100,
  373. medicalPackageDetailAmount:1,
  374. price:asbItemChoosed[i].price,
  375. medicalPackageDetailPrice:asbItemChoosed[i].price,
  376. medicalPackageDetailMoney: asbItemChoosed[i].price,
  377. asbitemMoney: asbItemChoosed[i].price,
  378. }
  379. this.medicalPackageAsbitems.push(pojo)
  380. //this.medicalPackageAsbitems.push({ ...pojo, asbitemName: asbItemChoosed[i].displayName })
  381. lfind = arrayExistObj(this.dict.asbItem, 'id', asbItemChoosed[i].id)
  382. if (lfind > -1) this.dict.asbItem.splice(lfind, 1)
  383. lfind = arrayExistObj(this.dict.asbItemQuick, 'id', asbItemChoosed[i].id)
  384. if (lfind > -1) this.dict.asbItemQuick.splice(lfind, 1)
  385. }
  386. },
  387. //双击选择组合项目
  388. dbClickChoosedAsb(row) {
  389. this.addAbs([row]);
  390. },
  391. //快速选择组合项目
  392. quickChoosedAsb(v) {
  393. //远程查询时,设置了 value-key 也不管用,只能取到value console.log('quickChoosedAsb',v)
  394. let lfind = -1
  395. if (v) {
  396. lfind = arrayExistObj(this.dict.asbItemQuick, 'id', v)
  397. if (lfind > -1) {
  398. this.addAbs([this.dict.asbItemQuick[lfind]])
  399. }
  400. }
  401. this.$nextTick(() => {
  402. this.$refs['quickAsbOCX'].blur(); //total asbItemId
  403. this.asbItemId = ''
  404. this.quickAsb = deepCopy(this.dict.asbItemQuick)
  405. this.$refs['quickAsbOCX'].focus(); //total asbItemId
  406. });
  407. },
  408. //选择 未选的组合项目
  409. chooseAsbItem(row){
  410. this.dict.asbItem.forEach((e,index) => {
  411. e.index = index;
  412. return e
  413. });
  414. // 按住了shift键
  415. if (this.window.shift) {
  416. //清除所有选择
  417. this.dict.asbItem.forEach(e => {
  418. e.choosed = false;
  419. return e
  420. });
  421. if (this.startPoint == - 1) {
  422. this.dict.asbItem[row.index].choosed = true;
  423. this.startPoint = row.index;
  424. return
  425. }
  426. if (this.startPoint > row.index) {
  427. for (let i = row.index; i <= this.startPoint; i++) {
  428. this.dict.asbItem[i].choosed = true
  429. }
  430. } else if (this.startPoint <= row.index) {
  431. for (let i = this.startPoint; i <= row.index; i++) {
  432. this.dict.asbItem[i].choosed = true
  433. }
  434. }
  435. return
  436. }
  437. // 按住了ctrl 键
  438. if (this.window.ctrl) {
  439. console.log('this.window.ctrl',this.window.ctrl,this.dict.asbItem)
  440. this.dict.asbItem[row.index].choosed = true;
  441. this.startPoint = row.index;
  442. return
  443. }
  444. // 未按住了ctrl 、shift 键
  445. //清除所有选择
  446. //console.log('清除所有选择')
  447. this.dict.asbItem.forEach(e => {
  448. e.choosed = false;
  449. return e
  450. });
  451. this.dict.asbItem[row.index].choosed = true;
  452. this.startPoint = row.index;
  453. },
  454. //删除 人员已选中的组合项目
  455. ///api/app/register-asbitem/many?RegisterAsbitemIds=3fa85f64-5717-4562-b3fc-2c963f66afa6
  456. delAbs(absForDel,oprType) {
  457. if(!this.formData.id){
  458. this.$message.warning("请先选中单位分组")
  459. return
  460. }
  461. if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
  462. this.$message.warning("体检次数已完成,不允许操作")
  463. return
  464. }
  465. let lfind = -1
  466. //勾选时不需要此操作 start
  467. if(oprType && oprType == 'all'){
  468. absForDel = deepCopy(this.medicalPackageAsbitems)
  469. }else if(oprType && oprType == 'choosed'){
  470. absForDel = []
  471. this.medicalPackageAsbitems.forEach(e =>{
  472. if(e.choosed){
  473. absForDel.push(deepCopy(e))
  474. e.choosed = false
  475. }
  476. })
  477. }
  478. //勾选时不需要此操作 end
  479. if (absForDel.length < 1) {
  480. this.$message.warning("请选择要移除的组合项目")
  481. return
  482. }
  483. for (let i = 0; i < absForDel.length; i++) {
  484. lfind = arrayExistObj(this.medicalPackageAsbitems, 'asbitemId', absForDel[i].asbitemId)
  485. if (lfind > -1) this.medicalPackageAsbitems.splice(lfind, 1)
  486. absForDel.splice(i, 1)
  487. i--
  488. continue
  489. }
  490. //刷新
  491. this.getAsbItemByItemType()
  492. },
  493. //双击删除已选项目
  494. removeAbs(row) {
  495. this.delAbs([row]);
  496. },
  497. //选择 已选的组合项目
  498. removeAsbItem(row){
  499. this.medicalPackageAsbitems.forEach((e,index) => {
  500. e.index = index;
  501. return e
  502. });
  503. // 按住了shift键
  504. if (this.window.shift) {
  505. //清除所有选择
  506. this.medicalPackageAsbitems.forEach(e => {
  507. e.choosed = false;
  508. return e
  509. });
  510. if (this.PstartPoint == - 1) {
  511. this.medicalPackageAsbitems[row.index].choosed = true;
  512. this.PstartPoint = row.index;
  513. return
  514. }
  515. if (this.PstartPoint > row.index) {
  516. for (let i = row.index; i <= this.PstartPoint; i++) {
  517. this.medicalPackageAsbitems[i].choosed = true
  518. }
  519. } else if (this.PstartPoint <= row.index) {
  520. for (let i = this.PstartPoint; i <= row.index; i++) {
  521. this.medicalPackageAsbitems[i].choosed = true
  522. }
  523. }
  524. return
  525. }
  526. // 按住了ctrl 键
  527. if (this.window.ctrl) {
  528. console.log('this.window.ctrl',this.window.ctrl,this.medicalPackageAsbitems)
  529. this.medicalPackageAsbitems[row.index].choosed = true;
  530. this.PstartPoint = row.index;
  531. return
  532. }
  533. // 未按住了ctrl 、shift 键
  534. //清除所有选择
  535. //console.log('清除所有选择')
  536. this.medicalPackageAsbitems.forEach(e => {
  537. e.choosed = false;
  538. return e
  539. });
  540. this.medicalPackageAsbitems[row.index].choosed = true;
  541. this.PstartPoint = row.index;
  542. },
  543. changeDiscount(index){
  544. this.medicalPackageAsbitems[index].medicalPackageDetailPrice =
  545. (this.medicalPackageAsbitems[index].discount * this.medicalPackageAsbitems[index].price/100).toFixed(2)
  546. this.medicalPackageAsbitems[index].medicalPackageDetailMoney =
  547. (this.medicalPackageAsbitems[index].medicalPackageDetailPrice * this.medicalPackageAsbitems[index].medicalPackageDetailAmount).toFixed(2)
  548. //this.getSummaries()
  549. },
  550. //修改价格或数量
  551. changePrices(index){
  552. this.medicalPackageAsbitems[index].medicalPackageDetailMoney =
  553. (this.medicalPackageAsbitems[index].medicalPackageDetailPrice * this.medicalPackageAsbitems[index].medicalPackageDetailAmount).toFixed(2)
  554. this.medicalPackageAsbitems[index].asbitemMoney =
  555. (this.medicalPackageAsbitems[index].price * this.medicalPackageAsbitems[index].medicalPackageDetailAmount).toFixed(2)
  556. this.medicalPackageAsbitems[index].discount = (this.medicalPackageAsbitems[index].medicalPackageDetailPrice * 100 / this.medicalPackageAsbitems[index].price).toFixed(2)
  557. //this.getSummaries()
  558. },
  559. //合计
  560. getSummaries(param) {
  561. console.log('getSummaries param',param)
  562. // if(!param){
  563. // param = {
  564. // columns:[{}, {}, {}, {}, {}, {}, {property: 'asbitemMoney'},{property: 'medicalPackageDetailMoney'}],
  565. // data:this.medicalPackageAsbitems
  566. // }
  567. // }
  568. const { columns, data } = param;
  569. const sumCol = [6, 7] //需合计的列
  570. const sums = [];
  571. columns.forEach((column, index) => {
  572. //console.log('column, index,data',column, index,data)
  573. //显示合计列
  574. if (index === 1) {
  575. sums[index] = '合计';
  576. return;
  577. }
  578. //不合计的列
  579. if (sumCol.indexOf(index) == -1) {
  580. sums[index] = '';
  581. return;
  582. }
  583. sums[index] = 0
  584. data.forEach(e => {
  585. if (!isNaN(e[column.property])) sums[index] += Number(e[column.property])// * e['amount']
  586. })
  587. sums[index] = sums[index].toFixed(2) //+ ' 元';
  588. });
  589. this.packagePrice = sums[7];
  590. // console.log('getSummaries',sums)
  591. // if (!this.totalFoucs) this.total = sums[5];
  592. // if (!this.discountFoucs) this.discount = Number(this.total * 100 / this.totalStand).toFixed(2);
  593. return sums;
  594. },
  595. //复制套餐
  596. btnCopyMedicalPackage(){
  597. if(!this.formData.id){
  598. this.$message.warning("请先选中单位分组")
  599. return
  600. }
  601. if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
  602. this.$message.warning("体检次数已完成,不允许操作")
  603. return
  604. }
  605. this.medicalPackageVisble = true
  606. },
  607. //选中套餐
  608. async packageRowClick(row){
  609. this.curPackageId = row.id
  610. this.packageAsbitems = []
  611. try {
  612. let res = await postapi('/api/app/medicalpackagedetail/getmedicalpackageinasbitem',{medicalPackageId:row.id})
  613. this.packageAsbitems = res.data
  614. } catch (error) {
  615. console.log(error)
  616. }
  617. },
  618. //双击选套餐,并确认复制
  619. async rowDblclick(row){
  620. await this.packageRowClick(row)
  621. this.copyMedicalPackage()
  622. },
  623. //复制套餐(确认选中套餐)
  624. copyMedicalPackage(){
  625. if(!this.curPackageId){
  626. this.$message.warning("请先选择要复制的套餐!")
  627. return
  628. }
  629. console.log('this.packageAsbitems',this.packageAsbitems)
  630. this.addAbs(deepCopy(this.packageAsbitems))
  631. this.medicalPackageVisble = false
  632. },
  633. //保存按钮
  634. btnSave() {
  635. if(!this.formData.id){
  636. this.$message.warning("请先选中套餐")
  637. return
  638. }
  639. let body = {
  640. medicalPackageId:this.formData.id,
  641. details:[]
  642. }
  643. // {
  644. // "medicalPackageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  645. // "details": [
  646. // {
  647. // "medicalPackageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  648. // "asbitemId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  649. // "price": 0,
  650. // "amount": 0
  651. // }
  652. // ]
  653. // }
  654. this.medicalPackageAsbitems.forEach(e =>{
  655. body.details.push({
  656. medicalPackageId:this.formData.id,
  657. asbitemId:e.id||e.asbitemId,
  658. price:e.medicalPackageDetailPrice,
  659. amount:e.medicalPackageDetailAmount
  660. })
  661. })
  662. let Package = deepCopy(this.formData);
  663. // /api/app/medical-package-detail/many
  664. postapi('/api/app/medicalpackagedetail/createmedicalpackagedetailmany',body
  665. ).then(res => {
  666. if(res.code != -1){
  667. delete Package.id;
  668. Package.price = this.packagePrice
  669. return postapi(`/api/app/medicalpackage/update?id=${this.formData.id}`, Package)
  670. }
  671. }).then(res =>{
  672. if(res.code != -1){
  673. this.$message.success("操作成功");
  674. Package.id = this.formData.id
  675. this.refreshMoney(Package)
  676. }
  677. })
  678. },
  679. //右侧勾选按钮
  680. selecteditems(val) {
  681. this.rightselctedata = val;
  682. console.log(this.rightselctedata);
  683. },
  684. // 左侧未选
  685. handleSelectionChange(val) {
  686. // this.selecteddata = val;
  687. this.unselecteddata = val;
  688. console.log(this.unselecteddata);
  689. },
  690. //获取当前列列表数据
  691. getmedicalPackageAsbitems(medicalPackageId) {
  692. if(medicalPackageId){
  693. postapi('/api/app/medicalpackagedetail/getmedicalpackageinasbitem',{medicalPackageId}).then((res) => {
  694. if(res.code != -1){
  695. this.medicalPackageAsbitems = res.data;
  696. this.getAsbItemByItemType()
  697. }
  698. });
  699. }else{
  700. this.medicalPackageAsbitems = []
  701. this.getAsbItemByItemType()
  702. }
  703. },
  704. },
  705. //监听事件
  706. watch: {
  707. //
  708. "formData.id"(newVal, oldVal) {
  709. console.log("formData.id ",newVal,oldVal);
  710. if (newVal != oldVal) {
  711. this.getmedicalPackageAsbitems(newVal);
  712. }
  713. },
  714. },
  715. };
  716. </script>
  717. <style scoped>
  718. .box {
  719. margin-top: 5px;
  720. border: 1px solid #000;
  721. }
  722. .btnClass {
  723. width:100px;
  724. margin-bottom: 5px
  725. }
  726. </style>