newIndex.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981
  1. <template>
  2. <view class="page-container">
  3. <uni-nav-bar
  4. fixed="true"
  5. statusBar="true"
  6. left-icon="back"
  7. title="搜索"
  8. @clickLeft="back"
  9. >
  10. <!--右菜单-->
  11. <template slot="right">
  12. <u-button
  13. type="success"
  14. size="small"
  15. class="u-reset-button nav-right-btn"
  16. @click="openTreePicker"
  17. text="选择分类"
  18. ></u-button>
  19. </template>
  20. </uni-nav-bar>
  21. <!-- 搜索栏 -->
  22. <view class="search-wrapper">
  23. <view class="search-bar">
  24. <view class="search-input-box">
  25. <uni-icons type="search" size="18" color="#999"></uni-icons>
  26. <input
  27. v-model="keyWord"
  28. placeholder="请输入关键字搜索"
  29. placeholder-class="search-placeholder"
  30. class="search-input"
  31. confirm-type="search"
  32. @confirm="doSearch"
  33. />
  34. </view>
  35. <view class="search-actions">
  36. <view class="filter-btn" @click="handleSearch">
  37. <image
  38. class="filter-icon"
  39. src="~@/static/pda/menu.svg"
  40. ></image>
  41. </view>
  42. <view class="search-btn" @click="doSearch">
  43. <text class="search-btn-text">搜索</text>
  44. </view>
  45. </view>
  46. </view>
  47. </view>
  48. <!-- 列表区域 -->
  49. <view class="list-container">
  50. <u-list @scrolltolower="scrolltolower">
  51. <checkbox-group
  52. v-for="(item, index) in list"
  53. :key="index"
  54. @change="(e) => selectVal(e, item, index)"
  55. >
  56. <label class="list-card">
  57. <view class="card-checkbox">
  58. <checkbox
  59. v-if="
  60. item.rootCategoryLevelId != 11 ||
  61. (item.rootCategoryLevelId == 11 && item.status != 1)
  62. "
  63. :value="item.code"
  64. color="#fff"
  65. :disabled="item.disabled"
  66. :checked="item.checked"
  67. />
  68. </view>
  69. <view class="card-content">
  70. <view class="card-header">
  71. <text class="card-title">{{ item.categoryName }}</text>
  72. <text class="card-code">{{
  73. item.rootCategoryLevelId == 4
  74. ? item.codeNumber
  75. : item.categoryCode
  76. }}</text>
  77. </view>
  78. <view class="card-body">
  79. <view
  80. v-for="(itm, idx) in tableH(item.rootCategoryLevelId)"
  81. :key="idx"
  82. class="info-item"
  83. v-if="!itm.formatter"
  84. >
  85. <text class="info-label">{{ itm.label }}</text>
  86. <text class="info-value">{{ item[itm.prop] }}</text>
  87. </view>
  88. <view class="info-item">
  89. <text class="info-label">批次号</text>
  90. <text class="info-value">{{ item.batchNo }}</text>
  91. </view>
  92. <view class="info-item">
  93. <text class="info-label">计量库存数量</text>
  94. <text class="info-value">{{ item.measureQuantity }} {{ item.measureUnit }}</text>
  95. </view>
  96. <view class="info-item">
  97. <text class="info-label">重量</text>
  98. <text class="info-value">{{ item.weight }} {{ item.weightUnit }}</text>
  99. </view>
  100. <view class="info-item">
  101. <text class="info-label">编号</text>
  102. <text class="info-value">{{ item.codeNumber }}</text>
  103. </view>
  104. <view class="info-item">
  105. <text class="info-label">仓库</text>
  106. <text class="info-value">{{ item.warehouseName }}</text>
  107. </view>
  108. </view>
  109. </view>
  110. </label>
  111. </checkbox-group>
  112. <view v-if="list.length == 0" class="empty-state">
  113. <u-empty iconSize="150" textSize="32" text="暂无数据"> </u-empty>
  114. </view>
  115. </u-list>
  116. </view>
  117. <!-- 底部操作栏 -->
  118. <view class="footer-bar">
  119. <view class="footer-left">
  120. <checkbox
  121. v-if="!seletedAll"
  122. color="#fff"
  123. :checked="seletedAll"
  124. @tap="_seletedAll"
  125. >全选</checkbox
  126. >
  127. <checkbox
  128. class="select-all"
  129. color="#fff"
  130. v-else
  131. :checked="seletedAll"
  132. @tap="_seletedAll"
  133. >取消全选
  134. </checkbox>
  135. </view>
  136. <view class="footer-right">
  137. <u-button
  138. type="success"
  139. size="small"
  140. class="u-reset-button confirm-btn"
  141. :disabled="!checkListLen"
  142. @click="jumpAdd(1)"
  143. >
  144. <view> 选择( {{ checkListLen }} ) </view>
  145. </u-button>
  146. <!-- <u-button v-if='rootCategoryLevelId == 23' type="success" size="small" class="u-reset-button"
  147. @click="jumpAdd(2)">
  148. <view> 确认 </view>
  149. </u-button> -->
  150. </view>
  151. </view>
  152. <ba-tree-picker
  153. ref="treePicker"
  154. key="verify"
  155. :multiple="false"
  156. @select-change="confirm"
  157. title="选择分类"
  158. :localdata="classificationList"
  159. valueKey="id"
  160. textKey="name"
  161. childrenKey="children"
  162. />
  163. <SearchPopup mode="top" v-if="searchShow">
  164. <template v-slot:list>
  165. <view class="search_list">
  166. <u-form
  167. labelPosition="left"
  168. :model="formData"
  169. labelWidth="180"
  170. labelAlign="left"
  171. class="baseForm"
  172. >
  173. <u-form-item
  174. label="仓库:"
  175. class="required-form"
  176. borderBottom
  177. prop="warehouseId"
  178. >
  179. <zxz-uni-data-select
  180. :localdata="warehouseList"
  181. v-model="formData.warehouseId"
  182. dataValue="id"
  183. format="{name}"
  184. dataKey="name"
  185. filterable
  186. ></zxz-uni-data-select>
  187. </u-form-item>
  188. <u-form-item
  189. label="维度:"
  190. v-if="isType == 'pick'"
  191. class="required-form"
  192. borderBottom
  193. prop="warehouseId"
  194. >
  195. <zxz-uni-data-select
  196. :localdata="dimensionList"
  197. v-model="formData.dimension"
  198. dataValue="id"
  199. format="{name}"
  200. dataKey="name"
  201. filterable
  202. ></zxz-uni-data-select>
  203. </u-form-item>
  204. </u-form>
  205. </view>
  206. </template>
  207. <template v-slot:operate>
  208. <view class="operate_box rx-bc">
  209. <u-button size="small" class="u-reset-button" @click="searchCancel">
  210. 重置
  211. </u-button>
  212. <u-button
  213. type="success"
  214. size="small"
  215. class="u-reset-button"
  216. @click="doSearch"
  217. >
  218. 确定
  219. </u-button>
  220. </view>
  221. </template>
  222. </SearchPopup>
  223. </view>
  224. </template>
  225. <script>
  226. import baTreePicker from "@/components/ba-tree-picker/ba-tree-picker.vue";
  227. import { tableHeader } from "../../common.js";
  228. import {
  229. treeByPid,
  230. pageeLedgerMain,
  231. assetPage,
  232. getWarehouseList,
  233. listInProduct,
  234. outsourceEndPick,
  235. categoryGetList,
  236. getBatchListInventory,
  237. getProductListInventory,
  238. } from "@/api/pda/workOrder.js";
  239. import SearchPopup from "../../components/searchPopup.vue";
  240. import { EventBus } from "@/utils/eventBus.js";
  241. let [isEnd] = [false];
  242. export default {
  243. components: {
  244. baTreePicker,
  245. SearchPopup,
  246. },
  247. data() {
  248. return {
  249. keyWord: null,
  250. rootCategoryLevelId: null,
  251. categoryLevelId: null,
  252. classificationList: [],
  253. treePickerShow: false,
  254. list: [],
  255. page: 1,
  256. seletedAll: false, //全选状态
  257. memoList: [],
  258. isType: null,
  259. taskId: null,
  260. pid: null, // 上个页面id
  261. storageKey: null,
  262. formData: {
  263. produceRoutingId: "",
  264. dimension: 2,
  265. },
  266. warehouseList: [],
  267. searchShow: false,
  268. stateList: [
  269. "启动",
  270. "空闲",
  271. "运行",
  272. "故障",
  273. "检修",
  274. "停机",
  275. "待料",
  276. "占用",
  277. ],
  278. classIds: [],
  279. dimensionList: [
  280. {
  281. id: 1,
  282. name: "物品维度",
  283. },
  284. {
  285. id: 2,
  286. name: "批次维度",
  287. },
  288. ],
  289. clientEnvironmentId:
  290. uni.getStorageSync("userInfo") &&
  291. uni.getStorageSync("userInfo").clientEnvironmentId, // *1 主环境-601环境 2 soll-索尔环境 3 tg-碳谷环境
  292. };
  293. },
  294. //选择的列表长度
  295. computed: {
  296. checkListLen() {
  297. return this.memoList.length;
  298. },
  299. },
  300. onLoad(option) {
  301. this.pid = option.id;
  302. this.classIds = option.classIds || [];
  303. this.isType = option.isType;
  304. if (option.taskId == "undefined") {
  305. this.taskId = null;
  306. } else {
  307. this.taskId = option.taskId || null;
  308. }
  309. if (Object.prototype.hasOwnProperty.call(option, "classIds")) {
  310. this.classIds = option.classIds;
  311. }
  312. if (option.storageKey) {
  313. this.storageKey = option.storageKey;
  314. this.memoList = [];
  315. if (this.isType == "feed") {
  316. let _arr =
  317. (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
  318. this.memoList = [
  319. ..._arr[0].modelList,
  320. ..._arr[0].equipmentList,
  321. ..._arr[0].instanceList,
  322. ..._arr[0].aridRegionList,
  323. ..._arr[0].turnover,
  324. ..._arr[0].palletList,
  325. ..._arr[0].revolvingDiskList,
  326. ..._arr[0].semiProductList,
  327. ];
  328. } else if (this.isType == "pick") {
  329. this.memoList =
  330. (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
  331. } else if (this.isType == "job") {
  332. let _obj =
  333. (this.storageKey && uni.getStorageSync(this.storageKey)) || {};
  334. if (Object.prototype.hasOwnProperty.call(_obj, "turnover")) {
  335. this.memoList = this.memoList.concat(_obj.turnover);
  336. } else if (
  337. Object.prototype.hasOwnProperty.call(_obj, "equipmentList")
  338. ) {
  339. this.memoList = this.memoList.concat(_obj.equipmentList);
  340. }
  341. } else if (this.isType == "zdy") {
  342. let _arr =
  343. (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
  344. if (
  345. _arr.length != 0 &&
  346. Object.prototype.hasOwnProperty.call(_arr[0], "turnover")
  347. ) {
  348. this.memoList = this.memoList.concat(_arr[0].turnover);
  349. } else if (
  350. _arr.length != 0 &&
  351. Object.prototype.hasOwnProperty.call(_arr[0], "equipmentList")
  352. ) {
  353. this.memoList = this.memoList.concat(_arr[0].equipmentList);
  354. } else if (
  355. _arr.length != 0 &&
  356. Object.prototype.hasOwnProperty.call(_arr[0], "standardOutputList")
  357. ) {
  358. this.memoList = this.memoList.concat(_arr[0].standardOutputList);
  359. } else if (
  360. _arr.length != 0 &&
  361. Object.prototype.hasOwnProperty.call(_arr[0], "bomMaterialList")
  362. ) {
  363. this.memoList = this.memoList.concat(_arr[0].bomMaterialList);
  364. }
  365. }
  366. }
  367. this.getTreeList();
  368. this.getWarehouseFn();
  369. },
  370. onUnload() {
  371. if (this.storageKey) {
  372. uni.removeStorage(this.storageKey);
  373. }
  374. },
  375. methods: {
  376. _seletedAll() {
  377. if (!this.seletedAll) {
  378. this.seletedAll = true;
  379. this.list.map((item) => {
  380. this.$set(item, "checked", true);
  381. const idx = this.memoList.findIndex((itm) => itm.id === item.id);
  382. if (idx === -1) {
  383. this.memoList.push(item);
  384. }
  385. });
  386. } else {
  387. this.seletedAll = false;
  388. this.list.map((item) => {
  389. this.$set(item, "checked", false);
  390. const idx = this.memoList.findIndex((itm) => itm.id === item.id);
  391. if (idx > -1) {
  392. this.memoList.splice(idx, 1);
  393. }
  394. });
  395. }
  396. },
  397. openTreePicker() {
  398. this.$refs.treePicker._show();
  399. },
  400. tableH(type) {
  401. return [
  402. {
  403. label: "型号",
  404. prop: "categoryModel",
  405. },
  406. {
  407. label: "规格",
  408. prop: "specification",
  409. },
  410. {
  411. label: "牌号",
  412. prop: "brandNum",
  413. },
  414. ];
  415. // return tableHeader(type);
  416. },
  417. getTreeList() {
  418. let params = {};
  419. console.log(this.classIds, "option", this.isType);
  420. if (this.isType == "feed") {
  421. // params.ids = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 26, 9, 28];
  422. params.ids = ["4, 5, 7, 8, 11, 14, 26"];
  423. } else if (this.isType == "pick") {
  424. // params.ids = [1, 5, 7, 8, 10, 13, 14, 23, 26, 9, 28]
  425. params.ids = [9, 23, 2, 1, 4, 14, 5, 8, 16, 13, 15, 6, 10, 22];
  426. } else if (this.isType == "job") {
  427. // params["ids"] = [4, 7];
  428. if (this.clientEnvironmentId == 2) {
  429. params["ids"] = [7];
  430. } else {
  431. params["ids"] = [4, 5, 7, 8, 11, 14, 26];
  432. }
  433. } else if (this.isType == "zdy") {
  434. params["ids"] = JSON.parse(this.classIds);
  435. } else if (this.isType == "weiwai") {
  436. // params['ids'] = JSON.parse(this.classIds)
  437. params["ids"] = [9, 23, 2, 1, 4, 14, 5, 8, 16, 13, 15, 6, 10, 22];
  438. }
  439. treeByPid(params).then((res) => {
  440. this.classificationList = res;
  441. this.confirm([res[0].id], res[0].name, res[0].rootCategoryLevelId);
  442. });
  443. },
  444. confirm(id, name, rootCategoryLevelId) {
  445. this.rootCategoryLevelId = rootCategoryLevelId;
  446. this.categoryLevelId = id;
  447. this.list = [];
  448. console.log("是这里嘛");
  449. this.getList();
  450. },
  451. doSearch() {
  452. this.list = [];
  453. this.getList();
  454. this.searchShow = false;
  455. },
  456. scrolltolower() {
  457. if (isEnd) return;
  458. this.page++;
  459. this.getList();
  460. },
  461. getList() {
  462. let param = {
  463. categoryLevelId: this.categoryLevelId,
  464. keyWord: this.keyWord,
  465. pageNum: this.page,
  466. size: 100,
  467. taskId: this.taskId,
  468. };
  469. if (this.rootCategoryLevelId == "11") {
  470. // 干燥区特殊处理
  471. param.size = 5;
  472. }
  473. isEnd = false;
  474. let URL = null;
  475. if (this.isType == "pick") {
  476. // 领料
  477. // if (this.rootCategoryLevelId == 23) {
  478. // this.list = []
  479. // param = {}
  480. // param.workOrderId = this.pid
  481. // URL = listOutsourceInWarehouse
  482. // } else {
  483. // param.dimension = 1
  484. // URL = pageeLedgerMain
  485. if (this.formData.dimension == 1) {
  486. URL = getProductListInventory;
  487. } else if (this.formData.dimension == 2) {
  488. URL = getBatchListInventory;
  489. }
  490. // }
  491. param.dimension = this.formData.dimension;
  492. // URL = pageeLedgerMain;
  493. } else if (this.isType == "feed") {
  494. // 投料
  495. if ([4, 7, 14].includes(Number(this.rootCategoryLevelId))) {
  496. URL = assetPage;
  497. } else if (this.rootCategoryLevelId == 2) {
  498. param.workOrderId = this.pid;
  499. delete param.taskId;
  500. delete param.categoryLevelId;
  501. URL = listInProduct;
  502. } else if (![2, 4, 7, 14].includes(Number(this.rootCategoryLevelId))) {
  503. URL = assetPage;
  504. // if (this.formData.dimension == 3) { // 包装维度
  505. // URL = getInventoryDetails
  506. // param.dimension = 3
  507. // param.rootCategoryLevelId = this.rootCategoryLevelId
  508. // } else if (this.formData.dimension == 4) { // 物料维度
  509. // param.dimension = 4
  510. // param.rootCategoryLevelId = this.rootCategoryLevelId
  511. // URL = getMaterielDetails
  512. // }
  513. }
  514. } else if (this.isType == "job" || this.isType == "zdy") {
  515. // 报工
  516. URL = assetPage;
  517. } else if (this.isType == "weiwai") {
  518. // 出库
  519. if (this.pid == 3) {
  520. URL = categoryGetList;
  521. } else {
  522. // URL = assetPdaPage
  523. URL = pageeLedgerMain;
  524. }
  525. }
  526. URL(param).then((res) => {
  527. if (this.rootCategoryLevelId == "11") {
  528. res.list.forEach((e) => {
  529. if (e.aridRegionList && e.aridRegionList.length != 0) {
  530. e.aridRegionList.map((i) => {
  531. const checked =
  532. this.memoList.findIndex((itm) => itm.id === i.id) > -1;
  533. let obj = {
  534. checked,
  535. name: e.name,
  536. region: e.extInfo.region,
  537. rootCategoryLevelId: e.rootCategoryLevelId,
  538. ...i,
  539. instanceId: i.id,
  540. };
  541. this.list.push(obj);
  542. });
  543. }
  544. });
  545. } else {
  546. this.list.push(
  547. ...res.list.map((i) => {
  548. const checked =
  549. this.memoList.findIndex((itm) => itm.id === i.id) > -1;
  550. const warehouseId = i.pathIds && i.pathIds.split(",")[0];
  551. return {
  552. checked,
  553. warehouseId,
  554. ...i,
  555. instanceId: i.id,
  556. };
  557. }),
  558. );
  559. }
  560. isEnd = this.list.length >= res.count;
  561. });
  562. },
  563. //勾选
  564. selectVal(e, val, index) {
  565. if (val.rootCategoryLevelId == 11 && val.status == 1) {
  566. return false;
  567. }
  568. this.list[index].checked = !this.list[index].checked;
  569. this.seletedAll = !this.list.some((item) => !item.checked);
  570. const idx = this.memoList.findIndex(
  571. (item) => item.id === this.list[index].id,
  572. );
  573. if (this.list[index].checked) {
  574. if (idx === -1) {
  575. this.memoList.push(this.list[index]);
  576. }
  577. } else {
  578. if (idx > -1) {
  579. this.memoList.splice(idx, 1);
  580. }
  581. }
  582. },
  583. handleSearch() {
  584. this.searchShow = true;
  585. },
  586. searchCancel() {
  587. this.list = [];
  588. this.page = 1;
  589. this.getList();
  590. this.searchShow = false;
  591. },
  592. //跳转回添加页面
  593. jumpAdd(type) {
  594. if (type == 1) {
  595. if (
  596. this.isType == "pick" ||
  597. this.isType == "feed" ||
  598. this.isType == "job" ||
  599. this.isType == "zdy" ||
  600. this.isType == "weiwai"
  601. ) {
  602. this.memoList.map((item) => {
  603. item.extInfo.heatNumber = "";
  604. });
  605. if (
  606. (this.isType == "zdy" || this.isType == "weiwai") &&
  607. (this.pid == 2 || this.pid == 3)
  608. ) {
  609. let param = {
  610. memoList: this.memoList,
  611. pid: this.pid,
  612. };
  613. console.log(param, "paramparamparam");
  614. EventBus.$emit("outEvent", { message: param });
  615. } else {
  616. uni.$emit("setSelectList", this.memoList, this.pid);
  617. }
  618. uni.navigateBack();
  619. }
  620. } else if (type == 2) {
  621. uni.showModal({
  622. title: "提示",
  623. content: "是否领取该工单半成品到此工序!",
  624. confirmText: "确认", //这块是确定按钮的文字
  625. success: (rr) => {
  626. if (rr.confirm) {
  627. let param = {
  628. taskId: this.taskId,
  629. workOrderId: this.pid,
  630. pickOutInList: this.list,
  631. };
  632. outsourceEndPick(param).then((res) => {
  633. // uni.$emit('setSelectList', this.list, this.pid)
  634. uni.showToast({
  635. title: "半成品领料成功,请先去审核",
  636. icon: "none",
  637. });
  638. uni.navigateBack();
  639. });
  640. }
  641. },
  642. });
  643. }
  644. },
  645. getWarehouseFn() {
  646. getWarehouseList().then((res) => {
  647. this.warehouseList = res;
  648. });
  649. },
  650. },
  651. };
  652. </script>
  653. <style lang="scss" scoped>
  654. .page-container {
  655. height: 100vh;
  656. overflow: hidden;
  657. display: flex;
  658. flex-direction: column;
  659. background-color: $page-bg;
  660. }
  661. /* 导航栏右侧按钮 */
  662. .nav-right-btn {
  663. border-radius: 30rpx !important;
  664. font-size: 24rpx !important;
  665. padding: 0 24rpx !important;
  666. }
  667. /* 搜索栏 */
  668. .search-wrapper {
  669. padding: 16rpx 24rpx;
  670. background-color: #fff;
  671. }
  672. .search-bar {
  673. display: flex;
  674. align-items: center;
  675. gap: 16rpx;
  676. }
  677. .search-input-box {
  678. flex: 1;
  679. display: flex;
  680. align-items: center;
  681. height: 72rpx;
  682. background-color: #f5f6f7;
  683. border-radius: 36rpx;
  684. padding: 0 24rpx;
  685. gap: 12rpx;
  686. }
  687. .search-input {
  688. flex: 1;
  689. height: 72rpx;
  690. font-size: 28rpx;
  691. color: $uni-text-color;
  692. }
  693. .search-placeholder {
  694. color: #c0c0c0;
  695. font-size: 26rpx;
  696. }
  697. .search-actions {
  698. display: flex;
  699. align-items: center;
  700. flex-shrink: 0;
  701. gap: 12rpx;
  702. }
  703. .filter-btn {
  704. width: 64rpx;
  705. height: 64rpx;
  706. display: flex;
  707. align-items: center;
  708. justify-content: center;
  709. background-color: #f5f6f7;
  710. border-radius: 50%;
  711. &:active {
  712. opacity: 0.7;
  713. }
  714. }
  715. .filter-icon {
  716. width: 40rpx;
  717. height: 40rpx;
  718. }
  719. .search-btn {
  720. height: 64rpx;
  721. padding: 0 32rpx;
  722. display: flex;
  723. align-items: center;
  724. justify-content: center;
  725. background-color: $theme-color;
  726. border-radius: 32rpx;
  727. &:active {
  728. opacity: 0.85;
  729. }
  730. }
  731. .search-btn-text {
  732. color: #fff;
  733. font-size: 26rpx;
  734. white-space: nowrap;
  735. }
  736. /* 列表容器 */
  737. .list-container {
  738. flex: 1;
  739. overflow: hidden;
  740. padding: 0 24rpx;
  741. /deep/ .u-list {
  742. height: 100% !important;
  743. }
  744. }
  745. /* 列表卡片 */
  746. .list-card {
  747. display: flex;
  748. align-items: flex-start;
  749. margin-top: 20rpx;
  750. padding: 24rpx;
  751. background: #fff;
  752. border-radius: 16rpx;
  753. box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);
  754. /deep/ .uni-checkbox-input-checked {
  755. background-color: $theme-color !important;
  756. border-color: $theme-color !important;
  757. }
  758. }
  759. .card-checkbox {
  760. flex-shrink: 0;
  761. margin-right: 16rpx;
  762. padding-top: 4rpx;
  763. }
  764. .card-content {
  765. flex: 1;
  766. min-width: 0;
  767. }
  768. .card-header {
  769. display: flex;
  770. justify-content: space-between;
  771. align-items: center;
  772. padding-bottom: 16rpx;
  773. border-bottom: 1rpx solid #f0f0f0;
  774. }
  775. .card-title {
  776. font-size: 30rpx;
  777. font-weight: 600;
  778. color: #1a1a1a;
  779. flex: 1;
  780. overflow: hidden;
  781. text-overflow: ellipsis;
  782. white-space: nowrap;
  783. }
  784. .card-code {
  785. font-size: 24rpx;
  786. color: $theme-color;
  787. background-color: rgba(21, 122, 44, 0.08);
  788. padding: 4rpx 16rpx;
  789. border-radius: 20rpx;
  790. flex-shrink: 0;
  791. margin-left: 16rpx;
  792. }
  793. .card-body {
  794. display: flex;
  795. flex-wrap: wrap;
  796. margin-top: 16rpx;
  797. gap: 0;
  798. }
  799. .info-item {
  800. width: 50%;
  801. display: flex;
  802. flex-direction: column;
  803. padding: 12rpx 0;
  804. box-sizing: border-box;
  805. &:nth-child(odd) {
  806. padding-right: 16rpx;
  807. }
  808. &:nth-child(even) {
  809. padding-left: 16rpx;
  810. border-left: 1rpx solid #f0f0f0;
  811. }
  812. }
  813. .info-label {
  814. font-size: 22rpx;
  815. color: #999;
  816. margin-bottom: 4rpx;
  817. line-height: 1.4;
  818. }
  819. .info-value {
  820. font-size: 26rpx;
  821. color: #333;
  822. word-break: break-all;
  823. line-height: 1.5;
  824. }
  825. /* 空状态 */
  826. .empty-state {
  827. margin-top: 20vh;
  828. }
  829. /* 底部操作栏 */
  830. .footer-bar {
  831. display: flex;
  832. align-items: center;
  833. justify-content: space-between;
  834. height: 110rpx;
  835. background: #fff;
  836. padding: 0 32rpx;
  837. box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
  838. /* 适配底部安全区域 */
  839. padding-bottom: constant(safe-area-inset-bottom);
  840. padding-bottom: env(safe-area-inset-bottom);
  841. /deep/ .uni-checkbox-input-checked {
  842. background-color: $theme-color !important;
  843. border-color: $theme-color !important;
  844. }
  845. }
  846. .footer-left {
  847. font-size: 28rpx;
  848. color: #333;
  849. }
  850. .footer-right {
  851. display: flex;
  852. align-items: center;
  853. }
  854. .confirm-btn {
  855. border-radius: 32rpx !important;
  856. padding: 0 36rpx !important;
  857. height: 68rpx !important;
  858. line-height: 68rpx !important;
  859. font-size: 28rpx !important;
  860. }
  861. /* 搜索弹窗 */
  862. .search_list {
  863. min-height: 100rpx;
  864. /deep/ .baseForm {
  865. padding: 0 24rpx;
  866. }
  867. }
  868. .operate_box {
  869. padding: 16rpx 24rpx;
  870. }
  871. </style>