500 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			500 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup lang="ts">
 | ||
| import { onMounted, computed, ref } from 'vue'
 | ||
| import { onLoad, onShow } from '@dcloudio/uni-app'
 | ||
| import { getListAPI, getDictAPI,postOperateAPIZF,updateBaoGong } from '@/services/moJuSheJiReport'
 | ||
| import { useLoginStore } from '@/stores/modules/login'
 | ||
| import { formatDate } from '@/utils/index'
 | ||
| import popup from './popup.vue';
 | ||
| import { nextTick } from 'vue';
 | ||
| 
 | ||
| 
 | ||
| const userStore = useLoginStore() 
 | ||
| const userId = userStore.userInfo.userId
 | ||
| 
 | ||
| // 是否分页结束
 | ||
| const isFinish = ref(false)
 | ||
| // 是否触发下拉刷新
 | ||
| const isTriggered = ref(false)
 | ||
| const progress = ref(0)
 | ||
| const imageLink = ref(0)
 | ||
| 
 | ||
| const selectedId = ref(null);  // 定义 selectedId 变量
 | ||
| 
 | ||
| // 定义 porps
 | ||
| const props = defineProps<{
 | ||
|   orderState: string
 | ||
| }>()
 | ||
| 
 | ||
| const statusText = computed(() => {
 | ||
|   const text = props.orderState == '0' ? '上报进度' : '查看'
 | ||
|   return text
 | ||
| })
 | ||
| // 是否加载中标记,用于防止滚动触底触发多次请求
 | ||
| const isLoading = ref(false)
 | ||
| // 请求参数
 | ||
| const queryParams: Required<any> = {
 | ||
|   pageNo: 1,
 | ||
|         pageSize: 5,
 | ||
|         owner: userId,
 | ||
|         //
 | ||
|         procedureStatusList: props.orderState,
 | ||
|         // 工序完成状态列表
 | ||
|         dispatchType: "ASSEMBLE",
 | ||
|         // 派工类型
 | ||
|         isReport: 1,
 | ||
|         pgType: 0,
 | ||
| }
 | ||
| const dataList = ref([])
 | ||
| const showPopup = ref(false);
 | ||
| 
 | ||
| const onPopupClose = (progress, imageLink) => {
 | ||
| 
 | ||
|   // 这里可以添加关闭弹出框时的逻辑,例如重置某些状态
 | ||
|   showPopup.value = false;
 | ||
|   
 | ||
|   
 | ||
|   const zid = selectedId.value;
 | ||
|   callApi(zid,progress,imageLink)
 | ||
| 	
 | ||
|   
 | ||
|   
 | ||
|   
 | ||
|   
 | ||
|   /* */
 | ||
|   
 | ||
| }; 
 | ||
|   const callApi = async (zid: Number,progress :Number,imageLink: String) => {
 | ||
| 	  console.log(progress);
 | ||
| 	  if(progress>0){
 | ||
| 	  	//调用报工接口,将录入的进度、图片链接和id传入进去
 | ||
| 	  	 await updateBaoGong(zid,progress,imageLink);
 | ||
| 	  	isFinish.value = false;
 | ||
| 	  	isLoading.value = false;
 | ||
| 	  	queryParams.pageNo = 1;
 | ||
| 	  	dataList.value = [];
 | ||
| 	  	await getListData(); 
 | ||
| 	  }else{
 | ||
| 		  uni.showToast({
 | ||
| 		          title: '设计进度填写时不能为0%,请重新填写后提交!',
 | ||
| 		          icon: 'none', // 显示纯文本时icon设为none
 | ||
| 		          duration: 2000
 | ||
| 		        });
 | ||
| 	  } 
 | ||
|   }
 | ||
| 
 | ||
| const getListData = async () => {
 | ||
| 	queryParams.pgType = props.orderState;
 | ||
|   // 如果数据出于加载中,退出函数
 | ||
|   if (isLoading.value) return
 | ||
|   if (isFinish.value === true) {
 | ||
|     return uni.showToast({ icon: 'none', title: '没有更多数据~' })
 | ||
|   }
 | ||
|   
 | ||
|   isLoading.value = true
 | ||
|   // 发送请求
 | ||
|   const data = await getListAPI(queryParams)
 | ||
|   isLoading.value = false
 | ||
|   data.list.forEach((e) => {
 | ||
| 	  
 | ||
| 	e.twoDimDate = formatDate(e.twoDimDate, "YYYY-MM-DD"); 
 | ||
| 	e.threeDimDate = formatDate(e.threeDimDate, "YYYY-MM-DD");
 | ||
| 	e.endTime = formatDate(e.endTime, "YYYY-MM-DD");
 | ||
|     
 | ||
|     
 | ||
|     
 | ||
|   })
 | ||
|   // 数组追加
 | ||
|   dataList.value.push(...data.list)
 | ||
|   // 分页条件
 | ||
|   if (queryParams.pageNo < data.total) {
 | ||
|     // 页码累加
 | ||
|     queryParams.pageNo++
 | ||
|   } else {
 | ||
|     // 分页已结束
 | ||
|     isFinish.value = true
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| onMounted(async () => {
 | ||
|   await getListData()
 | ||
| })
 | ||
| 
 | ||
| onShow(async () => {
 | ||
|   isFinish.value = false
 | ||
|   isLoading.value = false
 | ||
|   queryParams.pageNo = 1
 | ||
|   dataList.value = []
 | ||
|   await getListData()
 | ||
| })
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| const handleDetail =async  (item) => { 
 | ||
| 	progress.value = 0;
 | ||
| 	imageLink.value = item.blueprintLink;
 | ||
| 	await nextTick(); // 等待数据更新和DOM渲染
 | ||
| 	 showPopup.value = true;
 | ||
| 	selectedId.value = item.id;  // 为 selectedId 赋值
 | ||
|  /* const url = `/pages/zjPgMaster/zjPgMaster-detail?id=${item.id}`
 | ||
|   uni.navigateTo({ url }) */
 | ||
| }
 | ||
| 
 | ||
| /* const viewClick = (item) => {
 | ||
|   const params = {
 | ||
|     id: item.id
 | ||
|   }
 | ||
|   const data = await postOperateAPIZF(params);
 | ||
|   await getListData();
 | ||
| } */
 | ||
| //作废
 | ||
| const viewClick = async (item) => {
 | ||
| 	const params = {
 | ||
| 	  id: item.id
 | ||
| 	};
 | ||
|         const data = await postOperateAPIZF(params);
 | ||
|         if(data >0){
 | ||
|         	const url = `/pages/zjPgMaster/zjPgMaster`
 | ||
|         	
 | ||
|         	uni.navigateTo({ url })
 | ||
|         }
 | ||
|     };
 | ||
| 
 | ||
| 
 | ||
| // 自定义下拉刷新被触发
 | ||
| const onRefresherrefresh = async () => {
 | ||
|   // 开始动画
 | ||
|   isTriggered.value = true
 | ||
|   // 重置数据
 | ||
|   queryParams.pageNo = 1
 | ||
|   dataList.value = []
 | ||
|   isFinish.value = false
 | ||
|   // 加载数据
 | ||
|   await getListData()
 | ||
|   // 关闭动画
 | ||
|   isTriggered.value = false
 | ||
| }
 | ||
| // const searchVal = ref('')
 | ||
| // const dataListDefault = ref([])
 | ||
| // const handleSearch = async () => {
 | ||
| //   const code = searchVal.value
 | ||
| //   if (code) {
 | ||
| //     dataListDefault.value = dataList.value
 | ||
| //     dataList.value = dataList.value.filter((e) => {
 | ||
| //       return e.code == code
 | ||
| //     })
 | ||
| //   } else {
 | ||
| //     dataList.value = dataListDefault.value
 | ||
| //   }
 | ||
| // }
 | ||
| </script>
 | ||
| <template>
 | ||
|   <view class="cont">
 | ||
|     <!-- <view class="search" v-if="dataList.length > 5">
 | ||
|       <view class="title"></view>
 | ||
|       <input class="uni-input" v-model="searchVal" @change="handleSearch" placeholder="根据编号搜索" />
 | ||
|     </view> -->
 | ||
|     <scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered"
 | ||
|       @refresherrefresh="onRefresherrefresh" @scrolltolower="getListData">
 | ||
|       <view class="item" v-for="item in dataList" :key="item.id" >
 | ||
|         <view class="hd">
 | ||
|           <view class="num">项目编号:</view>
 | ||
| 		  <view class="statusLabel"> {{item.projectCode}} </view>
 | ||
| 		  <view class="statusTexthd" v-if="item.processDesignType == 'BLUEPRINT_2D'"> 2D设计 </view>
 | ||
| 		   <view class="statusTexthd" v-else-if ="item.processDesignType == 'BLUEPRINT_3D'"> 3D设计 </view>
 | ||
| 		  <view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_WORKBLANK'"> 毛坯设计 </view>
 | ||
| 		  <view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'"> 铸造设计 </view> 
 | ||
| 
 | ||
|         </view> 
 | ||
|         <view class="md">
 | ||
|           <view class="product-item">项目:{{ item.projectName }}</view>
 | ||
|           <view class="product-item">子项目:{{ item.projectSubCode || "" }}</view>
 | ||
| 		  <view class="product-item">客户名称:{{ item.customerName }}</view>
 | ||
| 		  <view class="product-item">工艺起止日期:{{item.twoDimDate}} ~ {{item.threeDimDate}} </view>   
 | ||
| 		  <view class="product-item">最新进度:{{item.progress}}%</view>
 | ||
|           <!-- <view class="product-item">预计生产日期:{{ item.startTime }} ~ {{ item.entTime }}</view> -->
 | ||
|         </view>
 | ||
|         <view class="statusText" @click="handleDetail(item)">{{ statusText }}</view>
 | ||
|       </view>
 | ||
|       <!-- 底部提示文字 -->
 | ||
|       <view class="loading-text" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }">
 | ||
|         {{ isFinish ? '没有更多数据~' : '正在加载...' }}
 | ||
|       </view>
 | ||
|     </scroll-view>
 | ||
| 	<!-- <popup  :show="showPopup" :progress="0.0" :imageLink="''" @close="onPopupClose" /> -->
 | ||
| 	 <popup :showPopup="showPopup" :progress="progress" :imageLink="imageLink" @close="onPopupClose" />   
 | ||
|   </view>
 | ||
| </template>
 | ||
| 
 | ||
| <style lang="scss">
 | ||
| // 订单列表
 | ||
| .search {
 | ||
|   padding: 4rpx;
 | ||
|   width: 80%;
 | ||
|   margin: 30rpx auto;
 | ||
| 
 | ||
|   .uni-input {
 | ||
|     border: 1px solid #D1D6DB;
 | ||
|     height: 60rpx;
 | ||
|     line-height: 60rpx;
 | ||
|     padding: 4rpx 10rpx;
 | ||
|     font-size: 32rpx;
 | ||
|     border-radius: 6rpx;
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| .data-list {
 | ||
|   height: 90vh;
 | ||
|   .item {
 | ||
|     position: relative;
 | ||
|     padding: 20rpx 0;
 | ||
|     margin: 20rpx 20rpx;
 | ||
|     border-radius: 10rpx;
 | ||
|     background-color: #fff;
 | ||
| 
 | ||
|     .hd {
 | ||
|       padding: 10rpx;
 | ||
|       font-size: 28rpx;
 | ||
|       display: flex;
 | ||
| 
 | ||
|       .statusLabel {
 | ||
|         font-size: 24rpx;
 | ||
|         color: #737D88;
 | ||
|       }
 | ||
| 	  .statusLabelzf {
 | ||
| 	    font-size: 24rpx;
 | ||
| 		position: absolute;
 | ||
| 		right: 30rpx;
 | ||
| 		top: 15rpx;
 | ||
| 		border-radius: 10rpx;
 | ||
| 		font-size: 24rpx;
 | ||
| 		padding: 10rpx 30rpx;
 | ||
| 		border-radius: 10rpx;
 | ||
| 		font-size: 24rpx;
 | ||
| 		background: linear-gradient(149deg, #ffff00 4%, #cfcf00 98%);
 | ||
| 		color: #fff;
 | ||
| 	    
 | ||
| 	  }
 | ||
|     }
 | ||
| 
 | ||
|     .md {
 | ||
|       position: relative;
 | ||
|       padding: 10rpx;
 | ||
|       min-height: 100rpx;
 | ||
|       font-size: 28rpx;
 | ||
|       border-top: 2rpx solid #F2F2F2;
 | ||
| 
 | ||
|       .product-item {
 | ||
|         margin: 20rpx 0;
 | ||
|         display: flex;
 | ||
|         align-items: center;
 | ||
|         color: #737D88
 | ||
|       }
 | ||
|       .product-row {
 | ||
|         margin: 20rpx 0;
 | ||
|         display: flex;
 | ||
|         flex-direction: row;
 | ||
|         justify-content: space-between;
 | ||
|         color: #737D88;
 | ||
|         .row-item {
 | ||
|           flex: 1;
 | ||
|           .label {
 | ||
|               margin-bottom: 10rpx;
 | ||
|             }
 | ||
|           
 | ||
|             .val {
 | ||
|               color: #1D2129;
 | ||
|               &.high-color {
 | ||
|                 color: #00B42A
 | ||
|               }
 | ||
|             }
 | ||
|         }
 | ||
|         
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     .statusText {
 | ||
|       position: absolute;
 | ||
|         right: 30rpx;
 | ||
|         top: 100rpx;
 | ||
|         border-radius: 10rpx;
 | ||
|         font-size: 24rpx;
 | ||
|         padding: 10rpx 30rpx;
 | ||
|         border-radius: 10rpx;
 | ||
|         font-size: 24rpx;
 | ||
|         background: linear-gradient(149deg, #d4e62d 4%, #c5ab1a 98%);
 | ||
|         color: #fff;
 | ||
|     }
 | ||
| 	.statusTexthd {
 | ||
| 	  position: absolute;
 | ||
| 	  right: 30rpx;
 | ||
| 	  top: 13rpx;
 | ||
| 	  border-radius: 10rpx;
 | ||
| 	  font-size: 24rpx;
 | ||
| 	  padding: 10rpx 30rpx;
 | ||
| 	  border-radius: 10rpx;
 | ||
| 	  font-size: 24rpx;
 | ||
| 	  background:  #2d9ce6;
 | ||
| 	  color: #fff;
 | ||
| 	}
 | ||
| 
 | ||
|     &:last-child {
 | ||
|       padding-bottom: 40rpx;
 | ||
|     }
 | ||
| 	
 | ||
|   }
 | ||
| 
 | ||
|   .status {
 | ||
|     display: flex;
 | ||
|     align-items: center;
 | ||
|     justify-content: space-between;
 | ||
|     font-size: 28rpx;
 | ||
|     color: #999;
 | ||
|     margin-bottom: 15rpx;
 | ||
| 
 | ||
|     .date {
 | ||
|       color: #666;
 | ||
|       flex: 1;
 | ||
|     }
 | ||
| 
 | ||
|     .primary {
 | ||
|       color: #ff9240;
 | ||
|     }
 | ||
| 
 | ||
|     .icon-delete {
 | ||
|       line-height: 1;
 | ||
|       margin-left: 10rpx;
 | ||
|       padding-left: 10rpx;
 | ||
|       border-left: 1rpx solid #e3e3e3;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .goods {
 | ||
|     display: flex;
 | ||
|     margin-bottom: 20rpx;
 | ||
| 
 | ||
|     .cover {
 | ||
|       width: 170rpx;
 | ||
|       height: 170rpx;
 | ||
|       margin-right: 20rpx;
 | ||
|       border-radius: 10rpx;
 | ||
|       overflow: hidden;
 | ||
|       position: relative;
 | ||
| 
 | ||
|       .image {
 | ||
|         width: 170rpx;
 | ||
|         height: 170rpx;
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     .quantity {
 | ||
|       position: absolute;
 | ||
|       bottom: 0;
 | ||
|       right: 0;
 | ||
|       line-height: 1;
 | ||
|       padding: 6rpx 4rpx 6rpx 8rpx;
 | ||
|       font-size: 24rpx;
 | ||
|       color: #fff;
 | ||
|       border-radius: 10rpx 0 0 0;
 | ||
|       background-color: rgba(0, 0, 0, 0.6);
 | ||
|     }
 | ||
| 
 | ||
|     .meta {
 | ||
|       flex: 1;
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
|       justify-content: center;
 | ||
|     }
 | ||
| 
 | ||
|     .name {
 | ||
|       height: 80rpx;
 | ||
|       font-size: 26rpx;
 | ||
|       color: #444;
 | ||
|     }
 | ||
| 
 | ||
|     .type {
 | ||
|       line-height: 1.8;
 | ||
|       padding: 0 15rpx;
 | ||
|       margin-top: 10rpx;
 | ||
|       font-size: 24rpx;
 | ||
|       align-self: flex-start;
 | ||
|       border-radius: 4rpx;
 | ||
|       color: #888;
 | ||
|       background-color: #f7f7f8;
 | ||
|     }
 | ||
| 
 | ||
|     .more {
 | ||
|       flex: 1;
 | ||
|       display: flex;
 | ||
|       align-items: center;
 | ||
|       justify-content: center;
 | ||
|       font-size: 22rpx;
 | ||
|       color: #333;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .payment {
 | ||
|     display: flex;
 | ||
|     justify-content: flex-end;
 | ||
|     align-items: center;
 | ||
|     line-height: 1;
 | ||
|     padding: 20rpx 0;
 | ||
|     text-align: right;
 | ||
|     color: #999;
 | ||
|     font-size: 28rpx;
 | ||
|     border-bottom: 1rpx solid #eee;
 | ||
| 
 | ||
|     .quantity {
 | ||
|       font-size: 24rpx;
 | ||
|       margin-right: 16rpx;
 | ||
|     }
 | ||
| 
 | ||
|     .amount {
 | ||
|       color: #444;
 | ||
|       margin-left: 6rpx;
 | ||
|     }
 | ||
| 
 | ||
|     .symbol {
 | ||
|       font-size: 20rpx;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .action {
 | ||
|     display: flex;
 | ||
|     justify-content: flex-end;
 | ||
|     align-items: center;
 | ||
|     padding-top: 20rpx;
 | ||
| 
 | ||
|     .button {
 | ||
|       width: 180rpx;
 | ||
|       height: 60rpx;
 | ||
|       display: flex;
 | ||
|       justify-content: center;
 | ||
|       align-items: center;
 | ||
|       margin-left: 20rpx;
 | ||
|       border-radius: 60rpx;
 | ||
|       border: 1rpx solid #ccc;
 | ||
|       font-size: 26rpx;
 | ||
|       color: #444;
 | ||
|     }
 | ||
| 
 | ||
|     .secondary {
 | ||
|       color: #3775F6;
 | ||
|       border-color: #3775F6;
 | ||
|     }
 | ||
| 
 | ||
|     .primary {
 | ||
|       color: #fff;
 | ||
|       background-color: #3775F6;
 | ||
|       border-color: #3775F6;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .loading-text {
 | ||
|     text-align: center;
 | ||
|     font-size: 28rpx;
 | ||
|     color: #666;
 | ||
|     padding: 20rpx 0;
 | ||
|   }
 | ||
| }
 | ||
| </style>import type { stringify } from 'querystring';
 | 
