fjj-condition.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. <template>
  2. <view>
  3. <uni-drawer :visible="visibleDrawer" mode="right" @close="closeDrawer()">
  4. <scroll-view class="drawer-list" scroll-y :style="{'height': '100%'}">
  5. <block v-for="(item, index) in menuList" :key="index">
  6. <!-- 单选、多选 isMutiple是否支持多选-->
  7. <view v-if="item.type == 'custom' && item.detailList.length">
  8. <view class="drawer-list-title flex justify-between">
  9. <view>
  10. {{item.title}}
  11. </view>
  12. <text v-if="item.detailList.length>showLenght"
  13. @tap="showMore(index)">{{item.showMoreList ? '收起' : '更多'}}</text>
  14. </view>
  15. <view class="draer-list-con">
  16. <template v-if="!item.showMoreList">
  17. <text
  18. :style="{background: textItem.isSelected ? color : '', color: textItem.isSelected ? '#ffffff' : ''}"
  19. v-if="idx<showLenght" v-for="(textItem, idx) in item.detailList" :key="idx"
  20. :class="textItem.isSelected ? 'on' : ''" @tap="itemTap(idx,item.detailList,item.key, item.isMutiple)">
  21. {{textItem.title}}
  22. </text>
  23. </template>
  24. <template v-else>
  25. <text
  26. :style="{background: textItem.isSelected ? color : '', color: textItem.isSelected ? '#ffffff' : ''}"
  27. v-for="(textItem, idx) in item.detailList" :key="idx" :class="textItem.isSelected ? 'on' : ''"
  28. @tap="itemTap(idx,item.detailList,item.key, item.isMutiple)">
  29. {{textItem.title}}
  30. </text>
  31. </template>
  32. </view>
  33. </view>
  34. <!-- 时间带时分秒范围选择 -->
  35. <view v-if="item.type == 'rangetime'">
  36. <view class="drawer-list-title flex justify-between">
  37. <view>
  38. {{item.title}}
  39. </view>
  40. </view>
  41. <view class="dateContent" @click="onShowDatePicker('rangetime', item.key)">
  42. <view>
  43. <template v-if="result[item.key] && result[item.key].length > 0">
  44. {{rangetime[0]}}
  45. </template>
  46. </view>
  47. <view>
  48. <template v-if="result[item.key] && result[item.key].length > 0">
  49. {{rangetime[1]}}
  50. </template>
  51. </view>
  52. </view>
  53. </view>
  54. <!-- 时间不带时分秒范围选择 -->
  55. <view v-if="item.type == 'range'">
  56. <view class="drawer-list-title flex justify-between">
  57. <view>
  58. {{item.title}}
  59. </view>
  60. </view>
  61. <view class="dateContent" @click="onShowDatePicker('range', item.key)">
  62. <view>
  63. <template v-if="result[item.key] && result[item.key].length > 0">
  64. {{range[0]}}-{{range[1]}}
  65. </template>
  66. </view>
  67. </view>
  68. </view>
  69. <!-- 时间不带时分秒单个选择 -->
  70. <view v-if="item.type == 'single'">
  71. <view class="drawer-list-title flex justify-between">
  72. <view>
  73. {{item.title}}
  74. </view>
  75. </view>
  76. <view class="dateContent" @click="onShowDatePicker('single', item.key)">
  77. <view>
  78. <!-- <template v-if="result[item.key] && result[item.key].length > 0"> -->
  79. <view style="margin-left:16rpx;color:#666;">{{single[0]}}</view>
  80. <!-- </template> -->
  81. <!-- <template v-else>
  82. <view style="margin-left:16rpx;color:#666;">请选择时间</view>
  83. </template> -->
  84. </view>
  85. </view>
  86. </view>
  87. <!-- 数值范围选择 -->
  88. <view v-if="item.type == 'rangenumber'">
  89. <view class="drawer-list-title flex justify-between">
  90. <view>
  91. {{item.title}}
  92. </view>
  93. </view>
  94. <view class="dateContent rangenumber-content flex">
  95. <view class="rangenumber-input">
  96. <input class="m-input" type="number" clearable v-model="minNumber"
  97. :placeholder="item.minPlaceholder || '最小值'" @blur="numberInputBlur(item.key)"></input>
  98. </view>
  99. <text>-</text>
  100. <view class="rangenumber-input">
  101. <input class="m-input" type="number" clearable v-model="maxNumber"
  102. :placeholder="item.maxPlaceholder || '最大值'" @blur="numberInputBlur(item.key)"></input>
  103. </view>
  104. </view>
  105. </view>
  106. <!-- 关键词 -->
  107. <view v-if="item.type == 'keyWord'">
  108. <view class="drawer-list-title flex justify-between">
  109. <view>
  110. {{item.title}}
  111. <view style="color:red;font-size:28rpx;">(注:搜索住院号或检查项目名称)</view>
  112. </view>
  113. </view>
  114. <view class="dateContent text-content flex">
  115. <view class="text-input">
  116. <input class="m-input" type="text" clearable v-model="keyWord" :placeholder="'请输入'+item.title"
  117. @blur="keyWordInputBlur(item.key)"></input>
  118. </view>
  119. </view>
  120. </view>
  121. <!-- 按床号排序 -->
  122. <view v-if="item.type == 'bedNumSort'">
  123. <view class="drawer-list-title flex justify-between">
  124. <view>
  125. {{item.title}}
  126. </view>
  127. </view>
  128. <view class="dateContent sort-content flex">
  129. <checkbox-group @change="bedNumSortInputBlur">
  130. <checkbox value="bedNumSort" :checked="bedNumSort" color="#49b856" />按床号排序
  131. </checkbox-group>
  132. </view>
  133. </view>
  134. <!-- 检查信息状态 -->
  135. <view v-if="item.type == 'inspectState'">
  136. <view class="drawer-list-title flex justify-between">
  137. <view>
  138. {{item.title}}
  139. </view>
  140. </view>
  141. <view class="dateContent inspectState-content flex">
  142. <!-- https://ext.dcloud.net.cn/plugin?id=1873#detail -->
  143. <ld-select :multiple="true" :list="inspectStateList" label-key="label" value-key="value" placeholder="请选择"
  144. v-model="result.inspectState" @change="inspectStateChange" @parentCancel="parentCancel"></ld-select>
  145. </view>
  146. </view>
  147. </block>
  148. <view class="filter-content-footer flex justify-center">
  149. <view class="filter-content-footer-item" @tap="resetClick">
  150. <text>重置</text>
  151. </view>
  152. <view class="filter-content-footer-item" :style="{color}" @tap="sureClick">
  153. <text>确认</text>
  154. </view>
  155. </view>
  156. </scroll-view>
  157. </uni-drawer>
  158. <mx-date-picker :show="showPicker" :color="color" :type="dateType" :value="dateValue" :show-tips="true"
  159. :show-seconds="true" @confirm="onSelected" @cancel="onSelected" />
  160. </view>
  161. </template>
  162. <script>
  163. /***
  164. * 筛选组件,当前支持多选、单选
  165. * list、visibleDrawer(是否显示)参数必填
  166. * item.type (custom 单选、多选、rangetime 时间范围带时分秒、range 时间范围不带时分秒、rangenumber 数字范围)
  167. * item.isMutiple 是否支持多选
  168. * 筛选后返回格式{"listName1":[value,value](多选),"listName2":"value"(单选),...}
  169. * rangenumber形式-可能为["",1]或[1,""]表示只有一个最大值或最小值
  170. ***/
  171. import uniDrawer from "@/components/uni-drawer/uni-drawer.vue";
  172. import ldSelect from "@/components/ld-select/ld-select.vue";
  173. import MxDatePicker from "@/components/mx-datepicker/mx-datepicker.vue";
  174. export default {
  175. props: {
  176. inspectStateList: {
  177. type: Array,
  178. default () {
  179. return [];
  180. },
  181. },
  182. keyWordGvie: {
  183. type: String,
  184. },
  185. bedNumSortGvie: {
  186. type: Boolean,
  187. },
  188. list: {
  189. required: true,
  190. type: Array,
  191. default () {
  192. return [];
  193. },
  194. },
  195. visibleDrawer: {
  196. required: true,
  197. type: Boolean,
  198. default: false,
  199. },
  200. color: {
  201. type: String,
  202. default: "#49b856",
  203. },
  204. },
  205. components: {
  206. uniDrawer,
  207. MxDatePicker,
  208. ldSelect,
  209. },
  210. created() {
  211. this.keyWord = this.keyWordGvie;
  212. this.bedNumSort = this.bedNumSortGvie;
  213. this.resetResult();
  214. uni.getSystemInfo({
  215. success: (res) => {
  216. this.drawerHeight = res.windowHeight - uni.upx2px(240) + "px";
  217. },
  218. });
  219. },
  220. computed: {
  221. defaultSelectedObj() {
  222. // 保存初始状态
  223. return this.getSelectedObj();
  224. },
  225. selectedObj: {
  226. get() {
  227. return this.getSelectedObj();
  228. },
  229. set(newObj) {
  230. return newObj;
  231. },
  232. },
  233. menuList() {
  234. return this.list;
  235. },
  236. },
  237. data() {
  238. return {
  239. menuKey: 1,
  240. showLenght: 6,
  241. drawerHeight: "500px",
  242. selectDetailList: [],
  243. result: {},
  244. showPicker: false,
  245. date: "",
  246. time: "",
  247. datetime: "",
  248. single: [new Date().Format("yyyy/MM/dd")],
  249. range: [
  250. new Date(new Date().getTime() - 24 * 60 * 60 * 1000).Format(
  251. "yyyy/MM/dd"
  252. ),
  253. new Date().Format("yyyy/MM/dd"),
  254. ],
  255. rangetime: [
  256. new Date(new Date().getTime() - 24 * 60 * 60 * 1000).Format(
  257. "yyyy/MM/dd hh:mm"
  258. ),
  259. new Date().Format("yyyy/MM/dd hh:mm"),
  260. ],
  261. dateType: "rangetime",
  262. dateValue: "",
  263. minNumber: "",
  264. maxNumber: "",
  265. keyWord: "",
  266. bedNumSort: false,
  267. };
  268. },
  269. methods: {
  270. parentCancel(flag) {
  271. if (flag == 1) {
  272. document.querySelector('.uni-drawer__content').style.width = '100vw';
  273. document.querySelector('.drawer-list').style.padding = '0';
  274. } else {
  275. document.querySelector('.uni-drawer__content').style.width = '200px';
  276. document.querySelector('.drawer-list').style.padding = '0 ' + uni.upx2px(20) + "px";
  277. }
  278. },
  279. getSelectedObj() {
  280. return this.commonResultObj();
  281. },
  282. resetResult() {
  283. this.result = this.commonResultObj();
  284. },
  285. commonResultObj() {
  286. let obj = {};
  287. console.log(this.menuList)
  288. this.menuList.map((item) => {
  289. item.isMutiple ?
  290. (obj[item.key] = []) :
  291. item.type === "range" || item.type === "rangetime" ?
  292. (obj[item.key] = []) :
  293. item.type === "bedNumSort" ?
  294. (obj[item.key] = false) :
  295. item.type === "inspectState" ?
  296. (obj[item.key] = ['1', '30']) :
  297. item.type === "single" ?
  298. (obj[item.key] = [new Date().Format("yyyy/MM/dd")]) :
  299. (obj[item.key] = "");
  300. });
  301. return obj;
  302. },
  303. //筛选项选中或取消
  304. itemTap(index, list, key, isMutiple) {
  305. if (isMutiple == true) {
  306. list[index].isSelected = !list[index].isSelected;
  307. if (list[index].isSelected) {
  308. this.selectedObj[key].push(list[index].value);
  309. } else {
  310. list[index].isSelected = false;
  311. var idx = this.selectedObj[key].indexOf(list[index].value);
  312. this.selectedObj[key].splice(idx, 1);
  313. }
  314. this.result[key] = this.selectedObj[key];
  315. } else {
  316. this.result[key] = list[index].isSelected ? "" : list[index].value;
  317. for (let i = 0; i < list.length; i++) {
  318. if (index == i && !list[i].isSelected) {
  319. list[i].isSelected = true;
  320. } else {
  321. list[i].isSelected = false;
  322. }
  323. }
  324. }
  325. // #ifdef H5
  326. this.$forceUpdate();
  327. // #endif
  328. },
  329. sureClick() {
  330. let str_result = {};
  331. let hasChoose = false;
  332. for (let key in this.result) {
  333. if (typeof this.result[key] == "object") {
  334. str_result[key] = this.result[key].join(",");
  335. if (!hasChoose) {
  336. hasChoose = this.result[key].join(",") !== "" ? true : false;
  337. }
  338. } else {
  339. str_result[key] = this.result[key];
  340. if (!hasChoose) {
  341. hasChoose = this.result[key] !== "" ? true : false;
  342. }
  343. }
  344. }
  345. this.$emit("result", {
  346. str_result: str_result,
  347. result: this.result,
  348. hasChoose: hasChoose,
  349. visibleDrawer: false,
  350. });
  351. },
  352. resetClick() {
  353. this.minNumber = "";
  354. this.maxNumber = "";
  355. this.keyWord = "";
  356. this.bedNumSort = false;
  357. this.single = [new Date().Format("yyyy/MM/dd")];
  358. for (let key in this.result) {
  359. if ((typeof this.result[key] == "object") && key != "inspectState") {
  360. if (key == "yyTime") {
  361. this.result[key] = [new Date().Format("yyyy/MM/dd")];
  362. } else {
  363. this.result[key] = [];
  364. }
  365. } else {
  366. if (key == "bedNumSort") {
  367. this.result[key] = false;
  368. } else if (key == "inspectState") {
  369. this.result[key] = ['1', '30'];
  370. } else {
  371. this.result[key] = "";
  372. }
  373. }
  374. }
  375. for (let i = 0; i < this.menuList.length; i++) {
  376. if (this.menuList[i].type == "custom") {
  377. for (let j = 0; j < this.menuList[i].detailList.length; j++) {
  378. this.menuList[i].detailList[j].isSelected = false;
  379. }
  380. }
  381. }
  382. // #ifdef H5
  383. this.$forceUpdate();
  384. // #endif
  385. },
  386. closeDrawer() {
  387. this.$emit("result", {
  388. changeStatus: true,
  389. visibleDrawer: false,
  390. });
  391. },
  392. showMore(index) {
  393. this.menuList[index].showMoreList = !this.menuList[index].showMoreList;
  394. ++this.menuKey;
  395. // #ifdef H5
  396. this.$forceUpdate();
  397. // #endif
  398. },
  399. onShowDatePicker(type, key) {
  400. //显示
  401. this.dateType = type;
  402. this.dateValue = this[type];
  403. this.showPicker = true;
  404. this.tempKey = key;
  405. },
  406. onSelected(e, key) {
  407. //选择
  408. this.showPicker = false;
  409. if (e) {
  410. this[this.dateType] = e.value;
  411. this.result[this.tempKey] = e.value;
  412. //选择的值
  413. console.log("value => " + e.value);
  414. //原始的Date对象
  415. console.log("date => " + e.date);
  416. }
  417. },
  418. numberInputBlur(key) {
  419. if (
  420. this.minNumber != "" &&
  421. this.maxNumber != "" &&
  422. parseFloat(this.minNumber) > parseFloat(this.maxNumber)
  423. ) {
  424. let temp = this.minNumber;
  425. this.minNumber = this.maxNumber;
  426. this.maxNumber = temp;
  427. }
  428. this.result[key] = [];
  429. this.result[key].push(this.minNumber && parseFloat(this.minNumber));
  430. this.result[key].push(this.maxNumber && parseFloat(this.maxNumber));
  431. },
  432. keyWordInputBlur(key) {
  433. this.result[key] = [];
  434. this.result[key].push(this.keyWord);
  435. },
  436. bedNumSortInputBlur(e) {
  437. this.result.bedNumSort = e.detail.value.length > 0;
  438. this.bedNumSort = e.detail.value.length > 0;
  439. },
  440. inspectStateChange(val) {
  441. this.result.inspectState = val;
  442. },
  443. },
  444. };
  445. </script>
  446. <style lang="scss" scoped>
  447. .flex {
  448. display: flex;
  449. }
  450. .justify-between {
  451. justify-content: space-between;
  452. }
  453. view,
  454. scroll-view,
  455. swiper,
  456. button,
  457. input,
  458. textarea,
  459. label,
  460. navigator,
  461. image {
  462. box-sizing: border-box;
  463. }
  464. /* 筛选样式 */
  465. .drawer-list {
  466. padding: 0 20rpx;
  467. font-size: 26rpx;
  468. }
  469. input {
  470. font-size: 26rpx;
  471. }
  472. .drawer-list .drawer-list-title {
  473. font-size: 34rpx;
  474. font-weight: 400;
  475. line-height: 48rpx;
  476. margin: 38rpx 0 18rpx;
  477. color: rgba(34, 34, 34, 1);
  478. }
  479. .drawer-list .drawer-list-title>text {
  480. font-size: 26rpx;
  481. color: #666666;
  482. }
  483. .drawer-list .draer-list-con>text {
  484. background: rgba(93, 92, 254, 0.1);
  485. border-radius: 28px;
  486. color: #666666;
  487. font-size: 28rpx;
  488. padding: 10rpx 28rpx;
  489. margin: 10rpx 10rpx 10rpx 0;
  490. display: inline-block;
  491. }
  492. .filter-content-footer-item {
  493. width: 160rpx;
  494. height: 72rpx;
  495. line-height: 72rpx;
  496. text-align: center;
  497. box-shadow: 0rpx 4rpx 16rpx rgba(0, 0, 0, 0.18);
  498. border-radius: 12rpx;
  499. margin: 24rpx;
  500. }
  501. .filter-content-footer-item:first-child {
  502. color: #49b856;
  503. }
  504. .picker {
  505. z-index: 99999 !important;
  506. }
  507. .dateContent {
  508. &>view {
  509. background: rgba(244, 244, 244, 1);
  510. border-radius: 8rpx;
  511. width: 100%;
  512. height: 64rpx;
  513. line-height: 64rpx;
  514. margin-bottom: 12rpx;
  515. }
  516. }
  517. .rangenumber-content {
  518. &>text {
  519. display: inline-block;
  520. width: 10%;
  521. text-align: center;
  522. height: 64rpx;
  523. line-height: 64rpx;
  524. }
  525. .rangenumber-input {
  526. width: 45%;
  527. display: inline-block;
  528. padding: 0 12rpx;
  529. .m-input {
  530. height: 64rpx;
  531. line-height: 64rpx;
  532. }
  533. }
  534. }
  535. .text-content {
  536. &>text {
  537. display: inline-block;
  538. width: 10%;
  539. text-align: center;
  540. height: 64rpx;
  541. line-height: 64rpx;
  542. }
  543. .text-input {
  544. width: 100%;
  545. display: inline-block;
  546. padding: 0 12rpx;
  547. .m-input {
  548. height: 64rpx;
  549. line-height: 64rpx;
  550. }
  551. }
  552. }
  553. .sort-content {
  554. font-size: 15px !important;
  555. display: flex;
  556. align-items: center;
  557. /deep/ uni-checkbox:not([disabled]) .uni-checkbox-input:hover {
  558. border-color: #49b856 !important;
  559. }
  560. }
  561. .inspectState-content {
  562. border-radius: 4px;
  563. width: 100%;
  564. height: 32px;
  565. line-height: 32px;
  566. margin-bottom: 6px;
  567. uni-picker {
  568. width: 100%;
  569. }
  570. .uni-input {
  571. padding-left: 16rpx;
  572. }
  573. }
  574. /deep/.picker {
  575. z-index: 999;
  576. }
  577. </style>