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.

397 lines
12 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
  1. <template>
  2. <div style="display: flex; ">
  3. <div style="width:230px;">
  4. <div style="display: flex;">
  5. <span>项目类别</span>
  6. <el-cascader :options="dict.itemTypeTree" v-model="itemTypeIds" style="margin-left: 3px;width:160px;"
  7. :props="{ checkStrictly: true, expandTrigger: 'hover', ...customerOrg.treeprops, }" :show-all-levels="false"
  8. clearable filterable @change="parseAsbitem" size="small">
  9. </el-cascader>
  10. </div>
  11. <div class="mainareaBox">
  12. <el-table :data="asbItems" :height="400" @row-dblclick="dbClickChoosedAsb"
  13. @selection-change="handleSelectionChange" size="small">
  14. <el-table-column type="selection" align="center" width="60" />
  15. <el-table-column prop="displayName" label="未选组合项目" width="160" />
  16. </el-table>
  17. </div>
  18. </div>
  19. <div style="width:100px;margin-top: 70px;">
  20. <div class="btnList">
  21. <el-button type="primary" @click="addAbs(asbItemChoosed)" style="width:90px;">添加 <i class="el-icon-right"></i>
  22. </el-button>
  23. </div>
  24. <div class="btnList">
  25. <el-button type="primary" @click="delAbs(asbItemOCXChoosed)" style="width:90px;">移除 <i class="el-icon-back"></i>
  26. </el-button>
  27. </div>
  28. </div>
  29. <div style="display: block; width:230px;">
  30. <div class="disTotal">
  31. <el-select v-model="asbItemId" placeholder="快速选择组合项目" size="small" filterable clearable remote automatic-dropdown
  32. :remote-method="remoteMethod" @change="quickChoosedAsb" default-first-option ref="asbItemId"
  33. style="width:150px;text-align: left;padding-right: 15px;">
  34. <el-option v-for="item in quickAsb" :key="item.id" :value="item.id" :label="item.displayName" />
  35. </el-select>
  36. </div>
  37. <div class="mainareaBox">
  38. <el-table :data="report.dataAsbitemOCX" height="400" width="100%" @row-dblclick="removeAbs"
  39. @selection-change="selecteditems" size="small">
  40. <!-- temporaryselection personnelUnit.nogroupselected-->
  41. <el-table-column type="selection" align="center" width="60" />
  42. <el-table-column label="已选组合项目" width="160" prop="displayName" />
  43. </el-table>
  44. </div>
  45. </div>
  46. <div style="width:100px;margin-top: 70px;">
  47. <div class="btnList">
  48. <el-button type="primary" @click="medicalPackageVisble = true" style="width:90px;">复制套餐</el-button>
  49. </div>
  50. <div class="btnList">
  51. <el-button type="primary" @click="btnOk('close')" style="width:90px;">确定 <i class="el-icon-check"></i>
  52. </el-button>
  53. </div>
  54. <div class="btnList"
  55. style="text-align: center;background-color: rgb(192, 192, 192);border-radius: 5%;padding: 5px 0;">
  56. 已选组合项<br>
  57. 目为空时即<br>
  58. 表示选择所<br>
  59. 有组合项自
  60. </div>
  61. </div>
  62. <!--复制套餐-->
  63. <el-dialog title="体检套餐" :visible.sync="medicalPackageVisble" width="600px" height="400"
  64. :show-close="false" :close-on-click-modal="false" :append-to-body="true">
  65. <el-table :data="dict.medicalPackage" border height="350" row-key="id" size="small"
  66. highlight-current-row @row-click="rowClick" @row-dblclick="rowDblclick" ref="patientList" >
  67. <!-- "displayName": "健康体检套餐",
  68. "price": 20.00,
  69. "forSexId": "0",
  70. "isActive": "Y",
  71. "remark": "2",
  72. "displayOrder": 1,
  73. "simpleCode": "JKTJTC",
  74. "creatorName": "admin",
  75. "lastModifierName": "users",
  76. "lastModificationTime": "2023-08-04T16:34:02.94408",
  77. "lastModifierId": "3a0ca83b-3116-da05-3916-dfd4c0c548cb",
  78. "creationTime": "2023-07-10T19:53:30.210553",
  79. "creatorId": "3a0c4180-107c-0c89-b25b-0bd34666dcec",
  80. "id": "3a0c51d3-2345-38df-ba0b-1862a3c3606f" -->
  81. <el-table-column type="index" width="50" />
  82. <el-table-column prop="displayName" label="套餐名称" width="180"/>
  83. <el-table-column prop="price" label="价格" width="80"/>
  84. <el-table-column prop="forSexId" label="适用性别" width="80">
  85. <template slot-scope="scope">
  86. <div>
  87. {{ dddw(dict.forSex, "id", scope.row.forSexId, "displayName") }}
  88. </div>
  89. </template>
  90. </el-table-column>
  91. <el-table-column prop="remark" label="备注" width="100"/>
  92. <el-table-column prop="creatorName" label="创建人员" width="80"/>
  93. <el-table-column prop="creationTime" label="创建日期" width="100">
  94. <template slot-scope="scope">
  95. <div v-if="scope.row.creationTime">
  96. {{ moment(scope.row.creationTime).format("yyyy-MM-DD") }}
  97. </div>
  98. </template>
  99. </el-table-column>
  100. <el-table-column prop="lastModifierName" label="修改人员" width="80"/>
  101. <el-table-column prop="lastModificationTime" label="修改日期" width="100">
  102. <template slot-scope="scope">
  103. <div v-if="scope.row.lastModificationTime">
  104. {{ moment(scope.row.lastModificationTime).format("yyyy-MM-DD") }}
  105. </div>
  106. </template>
  107. </el-table-column>
  108. </el-table>
  109. <span slot="footer" class="dialog-footer">
  110. <el-button @click="medicalPackageVisble = false" style="width:90px;">取消</el-button>
  111. <el-button type="primary" @click="copyMedicalPackage" style="width:90px;">确定</el-button>
  112. </span>
  113. </el-dialog>
  114. </div>
  115. </template>
  116. <script>
  117. import { mapState, mapActions } from "vuex";
  118. import moment from "moment";
  119. import { getapi, postapi, putapi, deletapi } from "@/api/api";
  120. import { dddw,arrayFilter, arrayReduce, arrayExistObj, deepCopy } from "../../utlis/proFunc";
  121. export default {
  122. components: {
  123. },
  124. props: ["patientRegisterForm", "payTypeFlag"],
  125. data() {
  126. return {
  127. itemTypeIds: [], //项目类别
  128. asbItems: [], //可被选的 asbItem
  129. asbItemChoosed: [], //勾选的 未选组合项目
  130. asbItemOCXChoosed: [], //勾选的 已选组合项目
  131. asbItemQuick: [], //可供 快速选择的组合项目
  132. quickAsb: [], //快速选择当前显的下拉数据
  133. asbItemId: '', //快速选择的组合项目ID
  134. medicalPackageVisble:false,
  135. curPackageId:'', //当前选中套餐ID
  136. packageAsbitems:[], //套餐中包含的组合项目
  137. };
  138. },
  139. computed: {
  140. ...mapState(["dict", "customerOrg", "patientRegister", "personnelUnit", "report"]),
  141. },
  142. created() {
  143. },
  144. mounted() {
  145. this.dictInit();
  146. },
  147. methods: {
  148. moment,dddw,
  149. dictInit() {
  150. //获取所有组合项目
  151. getapi("/api/app/asbitem/in-filter?Filter").then((res) => {
  152. if (res.code == 1) {
  153. this.dict.asbItemAll = res.data.items;
  154. this.parseAsbitem();
  155. }
  156. });
  157. //套餐
  158. getapi("/api/app/medical-package/in-filter").then((res) => {
  159. if (res.code == 1) {
  160. this.dict.medicalPackage = res.data.items;
  161. }
  162. });
  163. },
  164. //分析可选组合项目,及快速可选组合项目的数据
  165. parseAsbitem() {
  166. this.asbItemQuick = deepCopy(this.dict.asbItemAll);
  167. arrayReduce(this.asbItemQuick, this.report.dataAsbitemOCX, 'id');
  168. this.asbItems = deepCopy(this.asbItemQuick);
  169. if (this.itemTypeIds && this.itemTypeIds.length > 0) {
  170. this.asbItems = arrayFilter(this.asbItems, 'itemTypeId', this.itemTypeIds[this.itemTypeIds.length - 1])
  171. }
  172. },
  173. //未选组合项目 勾选情况
  174. handleSelectionChange(val) {
  175. // this.selecteddata = val;
  176. this.asbItemChoosed = val;
  177. //console.log(this.asbItemChoosed);
  178. },
  179. // 添加组合项目
  180. ///api/app/register-asbitem/many/3fa85f64-5717-4562-b3fc-2c963f66afa6'
  181. addAbs(asbItemChoosed) {
  182. if (asbItemChoosed.length < 1) {
  183. alert("请选择要添加的组合项目")
  184. return
  185. }
  186. arrayReduce(this.asbItems, asbItemChoosed, 'id')
  187. arrayReduce(this.asbItemQuick, asbItemChoosed, 'id')
  188. this.report.dataAsbitemOCX = this.report.dataAsbitemOCX.concat(asbItemChoosed)
  189. this.btnOk();
  190. },
  191. //人员已选组合项目 勾选情况
  192. selecteditems(val) {
  193. this.asbItemOCXChoosed = val
  194. },
  195. //删除 人员已选中的组合项目
  196. ///api/app/register-asbitem/many?RegisterAsbitemIds=3fa85f64-5717-4562-b3fc-2c963f66afa6
  197. delAbs(absForDel) {
  198. if (absForDel.length < 1) {
  199. alert("请选择要移除的组合项目")
  200. return
  201. }
  202. arrayReduce(this.report.dataAsbitemOCX, absForDel, 'id');
  203. this.asbItems = this.asbItems.concat(absForDel)
  204. this.asbItemQuick = this.asbItemQuick.concat(absForDel)
  205. this.btnOk();
  206. },
  207. //双击删除已选项目
  208. removeAbs(row) {
  209. this.delAbs([row]);
  210. },
  211. //双击选择组合项目
  212. dbClickChoosedAsb(row) {
  213. this.addAbs([row]);
  214. },
  215. //快速选择组合项目
  216. quickChoosedAsb(v) {
  217. //远程查询时,设置了 value-key 也不管用,只能取到value console.log('quickChoosedAsb',v)
  218. let lfind = -1
  219. if (v) {
  220. lfind = arrayExistObj(this.asbItemQuick, 'id', v)
  221. if (lfind > -1) {
  222. this.addAbs([this.asbItemQuick[lfind]])
  223. }
  224. }
  225. },
  226. //快速选择组合项目时,调整可按拼间简码及简称查找
  227. remoteMethod(keyWords) {
  228. //console.log('remoteMethod',this.dict.asbItemQuick)
  229. if (keyWords) {
  230. this.quickAsb = [];
  231. this.asbItemQuick.forEach(item => {
  232. if (item.displayName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
  233. || item.simpleCode.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
  234. || item.shortName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1) {
  235. this.quickAsb.push(item);
  236. }
  237. });
  238. } else {
  239. this.quickAsb = deepCopy(this.asbItemQuick);
  240. }
  241. },
  242. //选中套餐
  243. async rowClick(row){
  244. this.curPackageId = row.id
  245. this.packageAsbitems = []
  246. try {
  247. let res = await getapi(`/api/app/medical-package-detail/medical-package-in-asbitem?MedicalPackageId=${row.id}`)
  248. this.packageAsbitems = res.data
  249. } catch (error) {
  250. console.log(error)
  251. }
  252. },
  253. //双击选套餐,并确认复制
  254. async rowDblclick(row){
  255. await this.rowClick(row)
  256. this.copyMedicalPackage()
  257. },
  258. //复制套餐(确认选中套餐)
  259. copyMedicalPackage(){
  260. if(!this.curPackageId){
  261. this.$message.warning("请先选择要复制的套餐!")
  262. return
  263. }
  264. console.log('this.packageAsbitems',this.packageAsbitems)
  265. this.addAbs(this.packageAsbitems)
  266. this.medicalPackageVisble = false
  267. },
  268. btnOk(closed){
  269. if(this.report.dataAsbitemOCX && this.report.dataAsbitemOCX.length > 0){
  270. switch (this.report.dataAsbitemOCX.length) {
  271. case 1:
  272. this.patientRegister.query.asbitemOCX = this.report.dataAsbitemOCX[0].displayName
  273. break;
  274. default:
  275. this.patientRegister.query.asbitemOCX = this.report.dataAsbitemOCX[0].displayName + ',… + ' + this.report.dataAsbitemOCX.length
  276. break;
  277. }
  278. }else{
  279. this.patientRegister.query.asbitemOCX = ''
  280. }
  281. if(closed){
  282. this.report.dialogAsbitemOCX = false
  283. }
  284. }
  285. },
  286. //监听事件
  287. watch: {
  288. },
  289. };
  290. </script>
  291. <style lang="scss" scoped>
  292. @import "../../assets/css/global.css";
  293. .mainareaBox {
  294. border: 1px solid #000;
  295. height: 400px;
  296. margin-top: 5px;
  297. }
  298. .btnList {
  299. margin-top: 5px;
  300. margin-left: 5px;
  301. margin-right: 5px;
  302. }
  303. .disTotal {
  304. margin-left: 10px;
  305. }
  306. ::v-deep .el-input__inner {
  307. /*text-align: center;*/
  308. padding-left: 2px;
  309. padding-right: 15px;
  310. }
  311. ::v-deep .el-input__icon {
  312. width: 15px;
  313. /* 输入框下拉箭头或清除图标 默认 25 */
  314. }
  315. /* 表格 表头 列间距控制 */
  316. ::v-deep .el-table th.el-table__cell>.cell {
  317. text-align: center;
  318. /* 表格 表头 对齐方式,默认 left */
  319. padding-right: 2px;
  320. /* 表格 表头 列间距控制,默认 10px */
  321. padding-left: 2px;
  322. /* 表格 表头 列间距控制,默认 10px */
  323. }
  324. /* 表格 表体 首列左间距控制 */
  325. ::v-deep .el-table--border .el-table__cell:first-child .cell {
  326. padding-left: 2px;
  327. /* 表格 表体 首列左间距控制,默认 10px */
  328. }
  329. /* 表格 行列间距控制 ,默认 10 px*/
  330. ::v-deep .el-table__cell {
  331. padding: 2px 2px 2px 2px;
  332. /* 上,右,下,左 */
  333. }
  334. ::v-deep .cell {
  335. padding-left: 2px;
  336. padding-right: 2px;
  337. }
  338. ::v-deep .el-icon-date:before {
  339. content: ""
  340. }</style>