index.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <z-paging ref="paging" safe-area-inset-bottom v-model="list" bottom-bg-color="#fff" paging-class="paging-btm-shadow" @query="query">
  3. <template #top>
  4. <ut-navbar title="请选择追溯码" :fixed="false" :breadcrumb="false"></ut-navbar>
  5. <view class="pd-20">
  6. <ut-search ref="searchRef" v-model="form.keyword" @search="onRefresh" margin="0" :border="false" placeholder="搜生成批号、操作人" bgColor="#fff" height="86rpx" borderRadius="10rpx"></ut-search>
  7. </view>
  8. </template>
  9. <view class="base-content pd-20">
  10. <view :class="{ active: item.id === checkedId, disabled: isDisabled(item) }" v-for="(item, index) in list" :key="item.id" @click="clickItem(item)" class="b-radius bg-#fff pd-20 p-rtv select-item-card mb-20">
  11. <image v-if="item.id === checkedId" class="w-40 h-40 checked-icon" src="https://yujin-szyy.oss-cn-chengdu.aliyuncs.com/szyy/images-lm/price/checked1.png" mode="widthFix" />
  12. <view v-if="isDisabled(item)" class="disabled-tag">已选择</view>
  13. <view class="f-s-28 pd2-5-0">
  14. <span class="c-#666">生成批号:</span>
  15. <span class="c-#333 f-w-500">{{ item?.batchSn || '-' }}</span>
  16. </view>
  17. <view class="f-s-28 pd2-5-0 d-flex">
  18. <span class="c-#666">码段:</span>
  19. <view class="f-w-500 flex1 c-#333 f-w-500">
  20. <view>{{ item?.traceCodeStart || '-' }}<span class="c-#999"> 至 </span></view>
  21. <view>{{ item?.traceCodeEnd || '-' }}</view>
  22. </view>
  23. </view>
  24. <view class="d-flex">
  25. <view class="f-s-28 pd2-5-0 hcol-14">
  26. <span class="c-#666">生成数量:</span>
  27. <span class="c-#333 f-w-500">{{ item?.sumCount || '-' }}个</span>
  28. </view>
  29. <view class="f-s-28 pd2-5-0 hcol-16">
  30. <span class="c-#666">剩余数量:</span>
  31. <span class="c-#333 f-w-500">{{ +item?.sumCount - +item?.useCount - +item?.voidCount || '-' }}个</span>
  32. </view>
  33. </view>
  34. <view class="d-flex">
  35. <view class="f-s-24 pd2-5-0 hcol-14 up-line-1">
  36. <span class="c-#666">操作人:</span>
  37. <span class="c-#666">{{ item?.operatorName || '-' }}</span>
  38. </view>
  39. <view class="f-s-24 pd2-5-0 hcol-16 up-line-1">
  40. <span class="c-#666">生成时间:</span>
  41. <span class="c-#666">{{ parseTime(item?.createTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</span>
  42. </view>
  43. </view>
  44. </view>
  45. </view>
  46. <template #bottom>
  47. <view class="pd-20 d-flex">
  48. <up-button type="primary" @click="confirmSelect">确认选择</up-button>
  49. </view>
  50. </template>
  51. </z-paging>
  52. </template>
  53. <script setup lang="ts">
  54. import { useClientRequest } from '@/utils/request';
  55. import { parseTime } from '@/utils/ruoyi';
  56. const paging = ref<any>(null);
  57. const list = ref<any[]>([]);
  58. const form = ref({
  59. keyword: '',
  60. restFlag: '1',
  61. });
  62. const query = async (pageNum: number, pageSize: number) => {
  63. const res = await useClientRequest.get('/plt-api/app/traceCodeLog/list', {
  64. ...form.value,
  65. pageNum: pageNum,
  66. pageSize: pageSize,
  67. });
  68. if (res.code == 200) {
  69. paging.value.complete(res.rows || []);
  70. }
  71. };
  72. const checkedId = ref(null);
  73. const selectedIds = ref<number[]>([]);
  74. const isDisabled = (item: any) => selectedIds.value.includes(item?.id);
  75. const clickItem = (item: any) => {
  76. if (isDisabled(item)) {
  77. uni.showToast({
  78. title: '该追溯码段已被选择',
  79. icon: 'none',
  80. });
  81. return;
  82. }
  83. checkedId.value = item.id;
  84. };
  85. // 确认选择
  86. const confirmSelect = () => {
  87. const selectedItem = list.value.find((item) => item.id === checkedId.value);
  88. if (selectedItem && !isDisabled(selectedItem)) {
  89. uni.$emit(opts.value.callback, selectedItem);
  90. uni.navigateBack();
  91. } else {
  92. uni.showToast({
  93. title: '请选择一项追溯码段信息',
  94. icon: 'none',
  95. });
  96. }
  97. };
  98. const onRefresh = () => {
  99. try {
  100. paging.value?.reload();
  101. } catch (e) {
  102. console.error('Error refreshing address list:', e);
  103. }
  104. };
  105. const opts = ref({
  106. // 监听函数字符串
  107. callback: 'refreshCodesRange',
  108. });
  109. onLoad((options: any) => {
  110. console.log(options);
  111. opts.value.callback = options?.callback || 'refreshCodesRange';
  112. if (!options?.selectedIds) return;
  113. try {
  114. const ids = JSON.parse(decodeURIComponent(options.selectedIds));
  115. selectedIds.value = ids || [];
  116. } catch (error) {
  117. selectedIds.value = [];
  118. }
  119. });
  120. </script>
  121. <style lang="scss" scoped>
  122. .select-item-card {
  123. position: relative;
  124. border: 1rpx solid #fff;
  125. border-radius: 16rpx;
  126. overflow: hidden;
  127. .checked-icon {
  128. position: absolute;
  129. right: 0;
  130. bottom: 0;
  131. }
  132. &.active {
  133. border-color: $u-primary;
  134. background-color: #ebf6ee;
  135. }
  136. &.disabled {
  137. opacity: 0.55;
  138. background-color: #f5f5f5;
  139. }
  140. .disabled-tag {
  141. position: absolute;
  142. right: 20rpx;
  143. top: 20rpx;
  144. padding: 4rpx 12rpx;
  145. border-radius: 999rpx;
  146. font-size: 22rpx;
  147. color: #999;
  148. background-color: #ececec;
  149. }
  150. }
  151. </style>