zhang_li
8 months ago
49 changed files with 11357 additions and 15 deletions
@ -0,0 +1,11 @@ |
|||
import http from './http' |
|||
|
|||
// 获取人员列表
|
|||
export function getSelecUser(params) { |
|||
return http.get('/system/dept/selecUserByType',{params}) |
|||
} |
|||
|
|||
// 获取厂区列表
|
|||
export function getFactoryAreaList(params) { |
|||
return http.get('/system/dept/selectAllFactoryArea',{params}) |
|||
} |
@ -0,0 +1,38 @@ |
|||
import http from './http' |
|||
|
|||
// 根据设备号查询信息
|
|||
export function getDeviceDetailsByNumber(params) { |
|||
return http.get('/eam/device-accounts/getDetailsByNumber',{params}) |
|||
} |
|||
// 根据厂区查询设备
|
|||
export function getDeviceByFactoryAreaNumber(factoryAreaNumber) { |
|||
return http.get('/eam/device-accounts/selectData?factoryAreaNumber='+factoryAreaNumber) |
|||
} |
|||
// 添加报修
|
|||
export function deviceRepairCreate(data) { |
|||
return http.post('/eam/device-repair-request/create',data) |
|||
} |
|||
// 报修列表
|
|||
export function deviceRepairPage(params) { |
|||
return http.get('/eam/device-repair-request/getAppPage',{params}) |
|||
} |
|||
// 撤销
|
|||
export function rejected(id) { |
|||
return http.delete('/eam/device-repair-request/rejected?id='+id) |
|||
} |
|||
// 设备列表
|
|||
export function deviceList(params) { |
|||
return http.get('/eam/device-accounts/selectData',{params}) |
|||
} |
|||
// 设备分页列表
|
|||
export function devicePage(params) { |
|||
return http.get('/eam/device-accounts/getAppPage',{params}) |
|||
} |
|||
// 根据设备号码获取二级列表
|
|||
export function getSubList(params) { |
|||
return http.get('/eam/device-mold-items/getListByNumber',{params}) |
|||
} |
|||
// 新增申领备件时获取备件列表
|
|||
export function getApplyDeviceList() { |
|||
return http.get('/eam/device-accounts/selectAll') |
|||
} |
@ -0,0 +1,20 @@ |
|||
import http from './http' |
|||
|
|||
// 获取字典
|
|||
export function getDictList(type) { |
|||
return http.get('/eam/device-maintenance-job-main/getDictList?type=' + type) |
|||
} |
|||
export async function getDict(type) { |
|||
let data =[] |
|||
await getDictList(type).then((res) => { |
|||
if (res.code == 0) { |
|||
data = res.data.map(item=>{ |
|||
return { |
|||
label:item.label, |
|||
value:item.code, |
|||
} |
|||
}) |
|||
} else {} |
|||
}).catch((err) => {}) |
|||
return data |
|||
} |
@ -0,0 +1,5 @@ |
|||
import http from './http' |
|||
// 获取库位
|
|||
export function getLocation(number) { |
|||
return http.get('/eam/location/scanCodeByNumber?number='+number) |
|||
} |
@ -0,0 +1,21 @@ |
|||
import http from './http' |
|||
// 根据模具号查询信息
|
|||
export function getMoldDetailsByNumber(params) { |
|||
return http.get('/eam/mold-accounts/getDetailsByNumber',{params}) |
|||
} |
|||
// 根据厂区查询模具
|
|||
export function getMoldByFactoryAreaNumber(factoryAreaNumber) { |
|||
return http.get('/eam/mold-accounts/selectData?factoryAreaNumber='+factoryAreaNumber) |
|||
} |
|||
// 模具分页列表
|
|||
export function moldPage(params) { |
|||
return http.get('/eam/mold-accounts/getAppPage',{params}) |
|||
} |
|||
// 模具列表
|
|||
export function moldList(params) { |
|||
return http.get('/eam/mold-accounts/selectData',{params}) |
|||
} |
|||
// 新增申领备件时获取模具列表
|
|||
export function getApplyMoldList() { |
|||
return http.get('/eam/item-accounts/selectAll') |
|||
} |
@ -0,0 +1,35 @@ |
|||
import http from './http' |
|||
|
|||
|
|||
// 添加工单
|
|||
export function overhaulOrderCreate(data) { |
|||
return http.post('/eam/device-inspection-job-main/create',data) |
|||
} |
|||
// 编辑工单
|
|||
export function overhaulOrderUpdate(data) { |
|||
return http.put('/eam/device-inspection-job-main/updat',data) |
|||
} |
|||
// 报修列表
|
|||
export function overhaulOrderPage(params) { |
|||
return http.get('/eam/device-inspection-job-main/getAppPage',{params}) |
|||
} |
|||
// 操作工单
|
|||
export function orderClick(params) { |
|||
return http.get('/eam/device-inspection-job-main/onClick',{params}) |
|||
} |
|||
// 添加维修工单子项维修内容
|
|||
export function overhaulOrderDetailCreate(data) { |
|||
return http.post('/eam/device-inspection-job-detail/create',data) |
|||
} |
|||
// 编辑维修工单子项维修内容
|
|||
export function overhaulOrderDetailUpdate(data) { |
|||
return http.put('/eam/device-inspection-job-detail/update',data) |
|||
} |
|||
// 获得维修工单子列表
|
|||
export function overhaulOrderDetailList(params) { |
|||
return http.get('/eam/device-inspection-job-detail/selectListByNumber',{params}) |
|||
} |
|||
// 删除维修工单子
|
|||
export function overhaulOrderDetailDelete(id) { |
|||
return http.delete('/eam/device-inspection-job-detail/delete?id='+id) |
|||
} |
@ -0,0 +1,47 @@ |
|||
import http from './http' |
|||
|
|||
|
|||
// 添加工单
|
|||
export function repairOrderCreate(data) { |
|||
return http.post('/eam/device-maintenance-job-main/create',data) |
|||
} |
|||
// 编辑工单
|
|||
export function repairOrderUpdate(data) { |
|||
return http.put('/eam/device-maintenance-job-main/update',data) |
|||
} |
|||
// 工单列表
|
|||
export function repairOrderPage(params) { |
|||
return http.get('/eam/device-maintenance-job-main/getAppPage',{params}) |
|||
} |
|||
// 操作工单
|
|||
export function orderClick(params) { |
|||
return http.get('/eam/device-maintenance-job-main/orderClick',{params}) |
|||
} |
|||
// 添加维修工单子项维修内容
|
|||
export function repairOrderDetailCreate(data) { |
|||
return http.post('/eam/device-maintenance-job-detail/create',data) |
|||
} |
|||
// 编辑维修工单子项维修内容
|
|||
export function repairOrderDetailUpdate(data) { |
|||
return http.put('/eam/device-maintenance-job-detail/update',data) |
|||
} |
|||
// 获得维修工单子列表
|
|||
export function repairOrderDetailList(params) { |
|||
return http.get('/eam/device-maintenance-job-detail/selectListByNumber',{params}) |
|||
} |
|||
// 删除维修工单子
|
|||
export function repairOrderDetailDelete(id) { |
|||
return http.delete( '/eam/device-maintenance-job-detail/delete?id='+id) |
|||
} |
|||
//转办
|
|||
export function transfer(params) { |
|||
return http.get('/eam/device-maintenance-job-main/turnTo',{params}) |
|||
} |
|||
// 获取采取临时措施的维修工单
|
|||
export function repairOrderList(params) { |
|||
return http.get('/eam/device-maintenance-job-main/getList',{params}) |
|||
} |
|||
// 获取维修工单的报修信息
|
|||
export function getDeviceRepairDetailsByNumber(params) { |
|||
return http.get('/eam/device-repair-request/getDetailsByNumber',{params}) |
|||
} |
@ -0,0 +1,17 @@ |
|||
import http from './http' |
|||
// 获取tabs备件列表
|
|||
export function getSparePartsPage(params) { |
|||
return http.get('/eam/item/getAppPage',{params}) |
|||
} |
|||
// 获取备件列表
|
|||
export function getSparePartsList(params) { |
|||
return http.get('/eam/item/getListByNumber',{params}) |
|||
} |
|||
// 新增申领备件时获取备件列表
|
|||
export function getApplySparePartsList() { |
|||
return http.get('/eam/item/getApplyList') |
|||
} |
|||
// 新增备件维修获取备件列表
|
|||
export function getServiceSparePartsList() { |
|||
return http.get('/eam/item/getItemMaintainList') |
|||
} |
@ -0,0 +1,18 @@ |
|||
import http from './http' |
|||
|
|||
// 备件领用列表
|
|||
export function sparePartsApplicationPage(params) { |
|||
return http.get('/eam/item-apply-request-main/getAppPage',{params}) |
|||
} |
|||
// 领用备件
|
|||
export function sparePartsApplicationCreate(data) { |
|||
return http.post('/eam/item-apply-request-main/create',data) |
|||
} |
|||
// 撤回领用备件
|
|||
export function sparePartsApplicationCancle(id) { |
|||
return http.get('/eam/item-apply-request-main/backout?id=' + id) |
|||
} |
|||
// 领用备件详情
|
|||
export function sparePartsApplicationDetail(number) { |
|||
return http.get('/eam/item-apply-request-main/appGetByNumber?number=' + number) |
|||
} |
@ -0,0 +1,14 @@ |
|||
import http from './http' |
|||
|
|||
// 备件领用审批列表
|
|||
export function sparePartsApplicationApprovePage(params) { |
|||
return http.get('/eam/item-apply-request-main/getAppApprovePage',{params}) |
|||
} |
|||
// 通过申请
|
|||
export function sparePartsApplicationAgree(id) { |
|||
return http.get('/eam/item-apply-request-main/agree?id='+id) |
|||
} |
|||
// 驳回申请
|
|||
export function sparePartsApplicationReject(id) { |
|||
return http.get('/eam/item-apply-request-main/disAgree?id='+id) |
|||
} |
@ -0,0 +1,10 @@ |
|||
import http from './http' |
|||
|
|||
// 领用备件
|
|||
export function sparePartsServiceWorkOrderListCreate(data) { |
|||
return http.post('/eam/item-maintenance-record/create',data) |
|||
} |
|||
// 备件维修列表
|
|||
export function sparePartsServiceWorkOrderListPage(params) { |
|||
return http.get('/eam/item-maintenance-record/getAppPage',{params}) |
|||
} |
@ -0,0 +1,19 @@ |
|||
import http from './http' |
|||
|
|||
// 添加工单
|
|||
export function spotCheckOrderCreate(data) { |
|||
return http.post('/eam/device-spot-inspection-record-main/create',data) |
|||
} |
|||
// 编辑工单
|
|||
export function spotCheckOrderUpdate(data) { |
|||
return http.put('/eam/device-spot-inspection-record-main/update',data) |
|||
} |
|||
// 工单列表
|
|||
export function spotCheckOrderPage(params) { |
|||
return http.get('/eam/device-spot-inspection-record-main/getAppPage',{params}) |
|||
} |
|||
|
|||
// 操作工单
|
|||
export function orderClick(params) { |
|||
return http.get('/eam/device-spot-inspection-record-main/onClick',{params}) |
|||
} |
@ -0,0 +1,40 @@ |
|||
import http from './http' |
|||
|
|||
|
|||
// 添加工单
|
|||
export function upkeepOrderCreate(data) { |
|||
return http.post('/eam/device-maintain-job-main/create',data) |
|||
} |
|||
// 编辑工单
|
|||
export function upkeepOrderUpdate(data) { |
|||
return http.put('/eam/device-maintain-job-main/update',data) |
|||
} |
|||
// 工单列表
|
|||
export function upkeepOrderPage(params) { |
|||
return http.get('/eam/device-maintain-job-main/getAppPage',{params}) |
|||
} |
|||
// 接单
|
|||
export function orderClick(params) { |
|||
return http.get('/eam/device-maintain-job-main/orderClick',{params}) |
|||
} |
|||
|
|||
// 完成保养工单
|
|||
export function orderClickFinish(params) { |
|||
return http.get('/eam/device-maintain-job-main/orderClickFinish',{params}) |
|||
} |
|||
// 添加维修工单子项维修内容
|
|||
export function upkeepOrderDetailCreate(data) { |
|||
return http.post('/eam/device-maintain-job-detail/create',data) |
|||
} |
|||
// 编辑维修工单子项维修内容
|
|||
export function upkeepOrderDetailUpdate(data) { |
|||
return http.put('/eam/device-maintain-job-detail/update',data) |
|||
} |
|||
// 获得维修工单子列表
|
|||
export function upkeepOrderDetailList(params) { |
|||
return http.get('/eam/device-maintain-job-detail/selectListByNumber',{params}) |
|||
} |
|||
// 删除维修工单子
|
|||
export function upkeepOrderDetailDelete(id) { |
|||
return http.delete('/eam/device-maintain-job-detail/delete?id='+id) |
|||
} |
@ -0,0 +1,5 @@ |
|||
import http from './http' |
|||
// 用户密码重置
|
|||
export function updateUserPassword(data) { |
|||
return http.put('/eam/device-accounts/getDetailsByNumber',data) |
|||
} |
@ -0,0 +1,219 @@ |
|||
<template> |
|||
<!-- 设备 --> |
|||
<view class="work-container"> |
|||
<view class="cartNull" v-show="!token"> |
|||
还没有登录,请<navigator open-type="navigate" url="/pages/login">先登录</navigator> |
|||
</view> |
|||
<view class="" v-show='token'> |
|||
<Search @search='search' @screen='screen' :isShowScreen='false' /> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key='index'> |
|||
<u-image :src="item.images" width='160' height="160"> |
|||
<template v-slot:error> |
|||
<view class="image-error"> |
|||
<u-icon name="photo" color="#c7c7c7" size="38"></u-icon> |
|||
<view style="font-size: 24rpx;">暂无图片</view> |
|||
</view> |
|||
</template> |
|||
</u-image> |
|||
<view class="text"> |
|||
<view class="title"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="dec1"> |
|||
{{item.number}} |
|||
</view> |
|||
<view class="dec2"> |
|||
{{item.factoryAreaName}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
|
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import { |
|||
getAccessToken |
|||
} from '@/utils/auth' |
|||
import * as deviceApi from "@/api/device.js" |
|||
import Search from '../../components/search/index.vue' |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
name: '' |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
const token = ref('') |
|||
|
|||
// 搜索 |
|||
function search(keyWord) { |
|||
params.value.name = keyWord |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
function screen() { |
|||
proxy.$tab.navigateTo(`/pages/device/screen`) |
|||
} |
|||
function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
console.log('params.value',params.value) |
|||
deviceApi.devicePage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
onShow(() => { |
|||
if (getAccessToken()) { |
|||
token.value = getAccessToken() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
// onReachBottom() { |
|||
// this.getList() |
|||
// } |
|||
// export default { |
|||
// data() { |
|||
// return { |
|||
// params: { |
|||
// pageNo: 1, |
|||
// pageSize: 10, |
|||
// type: '', |
|||
// name:'' |
|||
// }, |
|||
// status: 'loadmore', //是否显示没有更多了 |
|||
// list: [], |
|||
// token:'' |
|||
// } |
|||
// }, |
|||
// methods: { |
|||
// // 搜索 |
|||
// search(keyWord) { |
|||
// this.params.name = keyWord |
|||
// this.params.pageNo = 1 |
|||
// this.list = [] |
|||
// this.status = 'loadmore' |
|||
// this.getList() |
|||
// }, |
|||
// // 筛选 |
|||
// screen() { |
|||
// this.$tab.navigateTo(`/pages/device/screen`) |
|||
// }, |
|||
// // 获取设备保修列表 |
|||
// getList() { |
|||
// if (this.status == 'nomore') return; |
|||
// this.status = 'loading'; |
|||
// this.$modal.loading('加载中') |
|||
// deviceApi.devicePage(this.params).then((res) => { |
|||
// this.$modal.closeLoading() |
|||
// if (res.data.list.length > 0) { |
|||
// this.list = this.list.concat(res.data.list); |
|||
// this.params.pageNo++; |
|||
// this.status = 'loadmore' |
|||
// } else { |
|||
// this.status = 'nomore' |
|||
// } |
|||
// }).catch(()=>{}) |
|||
// }, |
|||
// }, |
|||
// onShow() { |
|||
// if (getAccessToken()) { |
|||
// this.token = getAccessToken() |
|||
// this.params.pageNo = 1 |
|||
// this.list = [] |
|||
// this.status = 'loadmore' |
|||
// this.getList() |
|||
// } |
|||
// }, |
|||
// onReachBottom() { |
|||
// this.getList() |
|||
// } |
|||
// } |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.work-container{ |
|||
min-height: 100vh; |
|||
background: #f5f5f5; |
|||
} |
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
.text { |
|||
margin-left: 20rpx; |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.image-error { |
|||
text-align: center; |
|||
} |
|||
|
|||
.cartNull { |
|||
text-align: center; |
|||
padding: 500rpx 40rpx 0; |
|||
font-size: 28rpx; |
|||
color: #888; |
|||
} |
|||
|
|||
.cartNull navigator { |
|||
color: #2979ff; |
|||
} |
|||
</style> |
@ -0,0 +1,481 @@ |
|||
<template> |
|||
<!-- 添加设备报修 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="故障描述" prop="describes" required> |
|||
<u-input v-model="form.describes" placeholder="请输入故障描述" /> |
|||
</u-form-item> |
|||
<u-form-item label="类型" prop="type" required> |
|||
<view class="select" @click="openSingleColumn('type',form.type,appDeviceMoldType)"> |
|||
<view class="input" v-if='form.type'> |
|||
{{form.typeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" prop="deviceNumber" required> |
|||
<u-input v-model="form.deviceNumber" :placeholder="`请输入${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" |
|||
@blur="blur()" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}名称`" prop="deviceNumber" required |
|||
class="disabled"> |
|||
<u-input v-model="form.deviceName" :placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" |
|||
disabled /> |
|||
</u-form-item> |
|||
|
|||
<u-form-item :label="`厂区编码`" prop="factoryAreaNumber" required class="disabled"> |
|||
<u-input v-model="form.factoryAreaNumber" |
|||
:placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" disabled /> |
|||
</u-form-item> |
|||
<u-form-item :label="`厂区名称`" prop="factoryAreaName" required class="disabled"> |
|||
<u-input v-model="form.factoryAreaName" |
|||
:placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" disabled /> |
|||
</u-form-item> |
|||
<view class="image" style="margin-top: 20rpx;"> |
|||
<view class="image-list" v-if='imgList.length>0'> |
|||
<view class="image-item" v-for="(item,index) in imgList" :key="index"> |
|||
<image :src="item" mode=""></image> |
|||
<u-icon name="close-circle-fill" color="red" class="close" size="36" @click="delImage(index)"> |
|||
</u-icon> |
|||
</view> |
|||
</view> |
|||
<view class="image-item image-item1" @click="chooseImage" v-if='imgList.length<3'> |
|||
<image src="../../static/images/photo.png" mode=""></image> |
|||
</view> |
|||
</view> |
|||
</u-form> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as deviceApi from "@/api/device.js" |
|||
import * as moldApi from "@/api/mold.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as uploadApi from "@/api/upload.js" |
|||
import * as deptApi from "@/api/dept.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const appDeviceMoldType = ref([]) |
|||
const factoryAreaList = ref([]) |
|||
const form = ref({ |
|||
describes: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
factoryAreaName: '', |
|||
factoryAreaNumber: '', |
|||
type: '', |
|||
typeName:'' |
|||
}) |
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const imgList = ref([]) |
|||
const field = ref('') |
|||
const msg = ref('') |
|||
function chickRightButton(field) { |
|||
if (!form.value.type) { |
|||
proxy.$modal.showToast('请先选择类型') |
|||
return; |
|||
} |
|||
uni.scanCode({ |
|||
success: function (res) { |
|||
form.value.deviceNumber = res.result |
|||
getDetailsByNumber() |
|||
} |
|||
}); |
|||
} |
|||
function blur() { |
|||
if (form.value.deviceNumber) { |
|||
getDetailsByNumber() |
|||
} else { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
} |
|||
} |
|||
// 获取厂区列表 |
|||
function getFactoryAreaList() { |
|||
deptApi.getFactoryAreaList().then((res) => { |
|||
if (res.data && res.data.length > 0) { |
|||
res.data.map(item => { |
|||
item.value = item.id |
|||
item.label = item.name |
|||
}) |
|||
factoryAreaList.value = res.data |
|||
} else { |
|||
factoryAreaList.value = [] |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
// 根据设备/模具号查询信息 |
|||
function getDetailsByNumber() { |
|||
if (type.value == 'DEVICE' || type.value == 'TECH') { |
|||
deviceApi.getDeviceDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
type: type.value, |
|||
flag:1 |
|||
}).then((res) => { |
|||
console.log(res) |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch((err) => { |
|||
console.log(err) |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} else if (type.value == 'MOLD') { |
|||
moldApi.getMoldDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
flag:1 |
|||
}).then((res) => { |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch((err) => { |
|||
console.log(err) |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} |
|||
} |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.describes) { |
|||
proxy.$modal.showToast('请输入故障描述') |
|||
return; |
|||
} |
|||
if (!form.value.factoryAreaNumber) { |
|||
proxy.$modal.showToast(`请选择选择所属厂区`) |
|||
return; |
|||
} |
|||
if (!form.value.deviceNumber) { |
|||
proxy.$modal.showToast(`请选择${type.value == 'DEVICE' || type.value == 'TECH' ? '设备' : '模具'}`) |
|||
return; |
|||
} |
|||
if (!form.value.deviceName) { |
|||
proxy.$modal.showToast(msg.value) |
|||
return; |
|||
} |
|||
if (!form.value.type) { |
|||
proxy.$modal.showToast(`请选择类型'}`) |
|||
return; |
|||
} |
|||
const data = { |
|||
describes: form.value.describes, |
|||
deviceNumber: form.value.deviceNumber, |
|||
factoryAreaNumber: form.value.factoryAreaNumber, |
|||
type: type.value, |
|||
filePathList: imgList.value, |
|||
} |
|||
proxy.$modal.confirm('是否添加报修').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
deviceApi.deviceRepairCreate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value = {} |
|||
imgList.value = [] |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
if(form.value[field.value] == e[0].value)return; |
|||
form.value[field.value] = e[0].value |
|||
if (field.value == 'factoryAreaNumber') { |
|||
form.value.deviceNumber = '' |
|||
form.value.deviceName = '' |
|||
getDetailsByNumber() |
|||
} |
|||
if (field.value == 'type') { |
|||
type.value = form.value[field.value] |
|||
form.value.typeName = e[0].label |
|||
form.value.deviceNumber = '' |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
// getDetailsByNumber() |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
function chooseImage() { |
|||
uni.chooseImage({ |
|||
count: 1, // 默认9 |
|||
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 |
|||
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 |
|||
success: (res) => { |
|||
let filePath = res.tempFilePaths[0] |
|||
proxy.$modal.loading() |
|||
uploadApi.uploadFile({ |
|||
filePath: filePath, |
|||
name: 'file', |
|||
formData: { |
|||
'user': 'test' |
|||
}, |
|||
}).then(ret => { |
|||
proxy.$modal.closeLoading() |
|||
imgList.value.push(ret.data) |
|||
}).catch((err) => { |
|||
proxy.$modal.closeLoading() |
|||
}); |
|||
}, |
|||
}); |
|||
} |
|||
// 删除图片 |
|||
function delImage(index) { |
|||
imgList.value.splice(index, 1) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
appDeviceMoldType.value = await dictApi.getDict('app_device_mold_type') |
|||
if (type.value == 'DEVICE') { |
|||
appDeviceMoldType.value = appDeviceMoldType.value.filter((item => item.value != "MOLD")) |
|||
uni.setNavigationBarTitle({ |
|||
title: '设备报修' |
|||
}) |
|||
} else { |
|||
uni.setNavigationBarTitle({ |
|||
title: '模具报修' |
|||
}) |
|||
appDeviceMoldType.value =appDeviceMoldType.value.filter((item => item.value == "MOLD")) |
|||
} |
|||
form.value.type = appDeviceMoldType.value[0].value |
|||
form.value.typeName = appDeviceMoldType.value[0].label |
|||
getFactoryAreaList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
image { |
|||
width: 160rpx; |
|||
height: 160rpx; |
|||
margin-right: 20rpx; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.image { |
|||
padding: 0px 30rpx; |
|||
padding-bottom: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
flex-wrap: wrap; |
|||
|
|||
.image-list { |
|||
display: flex; |
|||
align-items: center; |
|||
flex-wrap: wrap; |
|||
} |
|||
} |
|||
|
|||
.image-item { |
|||
width: 210rpx; |
|||
height: 210rpx; |
|||
margin-right: 20rpx; |
|||
position: relative; |
|||
border: 1px solid rgba(230, 230, 230, 0.5); |
|||
margin-bottom: 20rpx; |
|||
border-radius: 20rpx; |
|||
overflow: hidden; |
|||
|
|||
image { |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
|
|||
.close { |
|||
position: absolute; |
|||
right: 0px; |
|||
top: 0px; |
|||
} |
|||
} |
|||
|
|||
.image-item1 { |
|||
border: none; |
|||
margin-right: 0px; |
|||
|
|||
image { |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,229 @@ |
|||
<template> |
|||
<!-- 设备报修 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="设备报修"> |
|||
<template v-slot:right> |
|||
<u-icon name="plus" color="#fff" size="36" style="padding-right: 30rpx;" @click="addForm"></u-icon> |
|||
</template> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
报修单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
类型:<span>{{item.type=='DEVICE'?'设备':item.type=='TECH'?'工艺':'模具'}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
|
|||
<view class="images"> |
|||
<image :src="cur" mode="" v-for="(cur,key) in item.filePathList" :key='key' |
|||
@click="previewImage(key,item.filePathList)"></image> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag :text="item.result" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' |
|||
type="primary" shape='circle' /> |
|||
</view> |
|||
<view class="button"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" |
|||
v-if="item.isCancel == 0" @click="cancle(item)">撤销</u-button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as deviceApi from "@/api/device.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
name: '' |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
const type = ref() |
|||
|
|||
function addForm() { |
|||
proxy.$tab.navigateTo(`/pages/deviceReport/addForm?type=${params.value.type}`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await deviceApi.deviceRepairPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
function cancle(item) { |
|||
proxy.$modal.confirm('确定撤销报修吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
deviceApi.rejected(item.id).then(async (res) => { |
|||
proxy.$modal.closeLoading() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
await getList() |
|||
proxy.$modal.showToast('撤销成功') |
|||
}).catch(() => { }) |
|||
}) |
|||
|
|||
} |
|||
function previewImage(current, array) { |
|||
uni.previewImage({ |
|||
urls: array, |
|||
current: current, |
|||
longPressActions: { |
|||
itemList: ['发送给朋友', '保存图片', '收藏'], |
|||
success: function (data) { |
|||
console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); |
|||
}, |
|||
fail: function (err) { |
|||
// console.log(err.errMsg); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
if (type.value == 'DEVICE') { |
|||
uni.setNavigationBarTitle({ |
|||
title: '设备报修' |
|||
}) |
|||
} else { |
|||
uni.setNavigationBarTitle({ |
|||
title: '模具报修' |
|||
}) |
|||
} |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
min-height: 100vh; |
|||
background: #f5f5f5; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
.status { |
|||
flex: 1; |
|||
} |
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.images { |
|||
display: flex; |
|||
width: 100%; |
|||
|
|||
image { |
|||
width: 30%; |
|||
margin-right: 20rpx; |
|||
height: 200rpx; |
|||
border-radius: 10rpx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,237 @@ |
|||
<template> |
|||
<!-- 设备报修 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="我的报修"> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
报修单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="images"> |
|||
<image :src="cur" mode="" v-for="(cur,key) in item.filePathList" :key='key' |
|||
@click="previewImage(key,item.filePathList)"></image> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag :text="item.result" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' |
|||
type="primary" shape='circle' /> |
|||
</view> |
|||
<!-- <view class="button"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" |
|||
v-if="item.isCancel == 0" @click="cancle(item)">撤销</u-button> |
|||
</view> --> |
|||
|
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as deviceApi from "@/api/device.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag: 1, |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await deviceApi.deviceRepairPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
function previewImage(current, array) { |
|||
uni.previewImage({ |
|||
urls: array, |
|||
current: current, |
|||
longPressActions: { |
|||
itemList: ['发送给朋友', '保存图片', '收藏'], |
|||
success: function (data) { |
|||
console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); |
|||
}, |
|||
fail: function (err) { |
|||
// console.log(err.errMsg); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.list { |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
.status { |
|||
flex: 1; |
|||
} |
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.images { |
|||
display: flex; |
|||
width: 100%; |
|||
|
|||
image { |
|||
width: 30%; |
|||
margin-right: 20rpx; |
|||
height: 200rpx; |
|||
border-radius: 10rpx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,163 @@ |
|||
<template> |
|||
<!-- 设备 --> |
|||
<view class="work-container"> |
|||
<view class="cartNull" v-show="!token"> |
|||
还没有登录,请<navigator open-type="navigate" url="/pages/login">先登录</navigator> |
|||
</view> |
|||
<view class="" v-show='token'> |
|||
<Search :searchData='searchData' @search='search' @screen='screen' :isShowScreen='false'/> |
|||
|
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key='index'> |
|||
<u-image :src="item.images" width='160' |
|||
height="160"> |
|||
<template v-slot:error> |
|||
<view class="image-error"> |
|||
<u-icon name="photo" color="#c7c7c7" size="38"></u-icon> |
|||
<view style="font-size: 24rpx;">暂无图片</view> |
|||
</view> |
|||
</template> |
|||
</u-image> |
|||
<view class="text"> |
|||
<view class="title"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="dec1"> |
|||
{{item.number}} |
|||
</view> |
|||
<view class="dec2"> |
|||
{{item.factoryAreaName}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import { |
|||
getAccessToken |
|||
} from '@/utils/auth' |
|||
import * as moldApi from "@/api/mold.js" |
|||
import Search from '../../components/search/index.vue' |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
name: '' |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
const token = ref('') |
|||
const searchData = ref({ |
|||
placeholder:'请输入模具名称' |
|||
}) |
|||
|
|||
// 搜索 |
|||
function search(keyWord) { |
|||
params.value.name = keyWord |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
function screen() { |
|||
proxy.$tab.navigateTo(`/pages/device/screen`) |
|||
} |
|||
function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
moldApi.moldPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
onShow(() => { |
|||
if (getAccessToken()) { |
|||
token.value = getAccessToken() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.work-container{ |
|||
min-height: 100vh; |
|||
background: #f5f5f5; |
|||
} |
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
.text { |
|||
margin-left: 20rpx; |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.image-error { |
|||
text-align: center; |
|||
} |
|||
.cartNull { |
|||
text-align: center; |
|||
padding: 500rpx 40rpx 0; |
|||
font-size: 28rpx; |
|||
color: #888; |
|||
} |
|||
|
|||
.cartNull navigator { |
|||
color: #2979ff; |
|||
} |
|||
</style> |
@ -0,0 +1,461 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="检修描述" prop="describes" required :class="form.id?'disabled':''"> |
|||
<u-input v-model="form.describes" placeholder="请输入检修描述" :disabled="form&&form.id?true:false" /> |
|||
</u-form-item> |
|||
<u-form-item label="维修工单" prop="maintenanceNumber" :class="form.id?'disabled':''"> |
|||
<view class="select" @click="openOrder"> |
|||
<view class="input" v-if='form.maintenanceNumber'> |
|||
{{form.maintenanceNumber}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择维修工单`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<!-- <u-form-item :label="`${type=='DEVICE'?'设备' : '模具'}名称`" prop="factoryAreaName" required :class="isDisabled?'disabled':''"> |
|||
<view class="select" @click="openSingleColumn('deviceNumber',form.deviceNumber,deviceList)"> |
|||
<view class="input" v-if='form.deviceName'> |
|||
{{form.deviceName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请输入${type=='DEVICE'?'设备' : '模具'}名称`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> --> |
|||
<u-form-item label="类型" prop="deviceNumber" required class="disabled"> |
|||
{{type =='DEVICE'||type == 'TECH'?'设备' : '模具'}} |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" prop="deviceNumber" required |
|||
:class="isDisabled?'disabled':''"> |
|||
<u-input v-model="form.deviceNumber" :placeholder="`请输入${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" |
|||
@blur="blur()" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton" v-show="!isDisabled"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}名称`" prop="deviceNumber" required |
|||
class="disabled"> |
|||
<u-input v-model="form.deviceName" :placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" |
|||
disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="所属厂区" prop="factoryAreaName" class="disabled"> |
|||
<u-input v-model="form.factoryAreaName" placeholder="请输入所属厂区" disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="故障类型" prop="faultType" required> |
|||
<view class="select" @click="openSingleColumn('faultType',form.faultType,faultType)"> |
|||
<view class="input" v-if='form.faultType'> |
|||
{{form.faultTypeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择故障类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as overhaulOrderApi from "@/api/overhaulOrder.js" |
|||
import * as moldApi from "@/api/mold.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import * as deviceApi from "@/api/device.js" |
|||
const { proxy } = getCurrentInstance() |
|||
|
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const form = ref({ |
|||
id: '', |
|||
describes: "", |
|||
maintenanceNumber: '', |
|||
factoryAreaNumber: '', |
|||
factoryAreaName: '', |
|||
faultType: '', |
|||
deviceName: '', |
|||
deviceNumber: '', |
|||
faultTypeName: '' |
|||
}) |
|||
|
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const faultType = ref([]) |
|||
const isDisabled = ref(false) |
|||
const choosesingleColumnItem = ref([]) |
|||
const msg = ref('') |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.describes) { |
|||
proxy.$modal.showToast('请输入故障描述') |
|||
return; |
|||
} |
|||
|
|||
if (!form.value.deviceNumber) { |
|||
proxy.$modal.showToast(`请选择${type.value == 'DEVICE' || type.value == 'TECH' ? '设备' : '模具'}名称`) |
|||
return; |
|||
} |
|||
if (!form.value.deviceName) { |
|||
proxy.$modal.showToast(msg.value) |
|||
return; |
|||
} |
|||
if (!form.value.faultType) { |
|||
proxy.$modal.showToast('请选择故障类型') |
|||
return; |
|||
} |
|||
const data = { |
|||
id: form.value && form.value.id ? form.value.id : '', |
|||
describes: form.value.describes, |
|||
maintenanceNumber: form.value.maintenanceNumber, |
|||
deviceNumber: form.value.deviceNumber, |
|||
factoryAreaNumber: form.value.factoryAreaNumber, |
|||
type: type.value, |
|||
faultType: form.value.faultType, |
|||
} |
|||
if (form.value.id) { |
|||
proxy.$modal.confirm('是否修改检修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
overhaulOrderApi.overhaulOrderUpdate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} else { |
|||
proxy.$modal.confirm('是否添加检修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
overhaulOrderApi.overhaulOrderCreate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value = { |
|||
id: '', |
|||
describes: "", |
|||
maintenanceNumber: '', |
|||
factoryAreaNumber:'', |
|||
factoryAreaName:'', |
|||
faultType: '', |
|||
deviceName:'', |
|||
deviceNumber:'', |
|||
faultTypeName:'' |
|||
} |
|||
isDisabled.value = false |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
if (fieldName == 'maintenanceNumber' && form.value.id) return; |
|||
if (fieldName == 'deviceNumber' && isDisabled.value) return; |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form.value[field.value] = e[0].value |
|||
|
|||
if (field.value == 'deviceNumber') { |
|||
choosesingleColumnItem.value = singleColumnList.value.filter(item => item.number == e[0].value) |
|||
form.value.deviceName = choosesingleColumnItem.value[0].name |
|||
form.value.factoryAreaName = choosesingleColumnItem.value[0].factoryAreaName |
|||
form.value.factoryAreaNumber = choosesingleColumnItem.value[0].factoryAreaNumber |
|||
} else if (field.value == 'faultType') { |
|||
form.value.faultTypeName = e[0].label |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
|
|||
// 扫描设备条码 |
|||
function chickRightButton(field) { |
|||
if (!form.value.type) { |
|||
proxy.$modal.showToast('请先选择类型') |
|||
return; |
|||
} |
|||
uni.scanCode({ |
|||
success: function (res) { |
|||
form.value.deviceNumber = res.result |
|||
getDetailsByNumber() |
|||
} |
|||
}); |
|||
} |
|||
function blur() { |
|||
if (form.value.deviceNumber) { |
|||
getDetailsByNumber() |
|||
} else { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
} |
|||
} |
|||
// 根据设备/模具号查询信息 |
|||
function getDetailsByNumber() { |
|||
if (type.value == 'DEVICE' || type.value == 'TECH') { |
|||
deviceApi.getDeviceDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
type: type.value |
|||
}).then((res) => { |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch((error) => { |
|||
console.log(error) |
|||
msg.value = error.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} else if (type.value == 'MOLD') { |
|||
moldApi.getMoldDetailsByNumber({ |
|||
number: form.value.deviceNumber |
|||
}).then((res) => { |
|||
console.log(22,res) |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch((error) => { |
|||
console.log(error) |
|||
msg.value = error.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} |
|||
} |
|||
function openOrder() { |
|||
proxy.$tab.navigateTo(`/pages/overhaulOrder/reqairOrderList?type=` + type.value) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.data) { |
|||
let data = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value = { |
|||
id: data.id, |
|||
describes: data.describes, |
|||
maintenanceNumber: data.maintenanceNumber, |
|||
deviceName: data.name, |
|||
deviceNumber: data.deviceNumber, |
|||
factoryAreaName: data.factoryAreaName, |
|||
faultType: data.faultType, |
|||
} |
|||
isDisabled.value = form.value.maintenanceNumber || form.value.id ? true : false |
|||
}; |
|||
faultType.value = await dictApi.getDict('fault_type') |
|||
uni.$on('chooseOrder', data => { |
|||
if (data) { |
|||
form.value.maintenanceNumber = data.number |
|||
form.value.deviceName = data.name |
|||
form.value.deviceNumber = data.deviceNumber |
|||
form.value.deviceName = data.name |
|||
form.value.factoryAreaName = data.factoryAreaName |
|||
form.value.factoryAreaNumber = data.factoryAreaNumber |
|||
isDisabled.value = true |
|||
} else { |
|||
form.value.maintenanceNumber = '' |
|||
form.value.deviceName = '' |
|||
form.value.deviceNumber = '' |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
isDisabled.value = false |
|||
} |
|||
|
|||
}) |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
image { |
|||
width: 160rpx; |
|||
height: 160rpx; |
|||
margin-right: 20rpx; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,666 @@ |
|||
<template> |
|||
<!-- 添加检修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="检修描述" prop="name" required> |
|||
<u-input v-model="form.name" placeholder="请输入检修描述" maxlength="50" /> |
|||
</u-form-item> |
|||
<u-form-item label="预估人数" prop="peoples" required> |
|||
<u-input v-model="form.peoples" type="number" placeholder="请输入预估人数" maxlength="50" /> |
|||
</u-form-item> |
|||
<u-form-item label="预估分钟" prop="estimatedMinutes" required> |
|||
<u-input v-model="form.estimatedMinutes" type="number" placeholder="请输入预估分钟" maxlength="50" /> |
|||
</u-form-item> |
|||
<u-form-item label="实际分钟" prop="actualMinutes" required> |
|||
<u-input v-model="form.actualMinutes" type="number" placeholder="请输入实际分钟" maxlength="50" /> |
|||
</u-form-item> |
|||
<u-form-item label="责任人" prop="chargePeoples" required> |
|||
<view class="select" @click="openSelecUser"> |
|||
<view class="input" v-if='form.chargePeoples'> |
|||
{{selectFormatCheck(form.chargePeoples,selecUserList)}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择维修人员 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="完成情况" prop="status" required> |
|||
<view class="select" @click="openSingleColumn('status',form.status,jxDetailsStatus,'form')"> |
|||
<view class="input" v-if='form.status'> |
|||
{{form.statusTxt}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择完成情况`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="完成时间" prop="completionTime" required v-if='form.status === 0||form.status === "0"'> |
|||
<view class="select" @click="openDatetime('completionTime',formatDate,params,formatValue)"> |
|||
<view class="input" v-if='formatDate'> |
|||
{{formatDate}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择完成时间`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="未完成原因" prop="uncompleted" required v-if='form.status === 1||form.status === "1"'> |
|||
<u-input type='textarea' v-model="form.uncompleted" placeholder="请输入未完成原因" maxlength="200" /> |
|||
</u-form-item> |
|||
<u-form-item label="工程师确认" prop="engineer"> |
|||
<u-input v-model="form.engineer" placeholder="请输入工程师确认" maxlength="50" /> |
|||
</u-form-item> |
|||
|
|||
</u-form> |
|||
|
|||
<view class="list"> |
|||
<view class="title"> |
|||
<span></span>备件 |
|||
</view> |
|||
<view class="item " v-for="(item,index) in form.itemNumbers" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="12"> |
|||
<view class="dec"> |
|||
<view class=""> |
|||
数量:{{item.qty}} |
|||
</view> |
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
<u-icon name="minus-circle" color="#aaaaaa" size="60" @click="delSpareParts(index)"></u-icon> |
|||
</view> |
|||
<view class="add-btn"> |
|||
<u-button type="primary" @click="open"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加备件</u-button> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 添加备件 --> |
|||
<u-popup v-model="isPopupShow" mode="center" border-radius="14"> |
|||
<view class="popup-title">添加备件</view> |
|||
<view class="popup"> |
|||
<u-form :model="form1" ref="form1Ref" label-width="160rpx"> |
|||
<u-form-item :label="`备件`" prop="number" required> |
|||
<view class="select" @click="openSingleColumn('number',form1.number,sparePartsList,'form1')"> |
|||
<view class="input" v-if='form1.number'> |
|||
{{form1.name}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择备件 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="数量" prop="qty" required> |
|||
<u-input v-model="form1.qty" type="number" placeholder="请输入数量" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isPopupShow = false">取消</view> |
|||
<view class="sure" @click="addSpare">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<!-- 选择维修人员 --> |
|||
<u-popup v-model="isShowSelecUser" mode="center" border-radius="14"> |
|||
<view class="popup-title">选择维修人员</view> |
|||
<view class="popup"> |
|||
<u-checkbox-group @change="checkboxGroupChange"> |
|||
<u-checkbox v-model="item.checked" v-for="(item, index) in selecUserList" :key="index" |
|||
:name="item.id">{{item.name}}</u-checkbox> |
|||
</u-checkbox-group> |
|||
|
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isShowSelecUser = false">取消</view> |
|||
<view class="sure" @click="chooseUser">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
<u-picker mode="time" v-model="datetimeShow" :default-time='datetimeDefaultValue' :params="params" |
|||
@confirm='chooseDatetime'></u-picker> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as overhaulOrderApi from "@/api/overhaulOrder.js" |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import * as deptApi from "@/api/dept.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
const { proxy} = getCurrentInstance() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
// 备件弹窗 |
|||
const isPopupShow = ref(false) |
|||
const sparePartsList = ref([]) |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const selecUserList = ref([])//负责人员 |
|||
const isShowSelecUser = ref(false) |
|||
const jxDetailsStatus = ref([])//完成情况 |
|||
const formatDate = ref('')//日期展示 |
|||
const form = ref({ |
|||
number: '', |
|||
name: '', |
|||
peoples: null, |
|||
estimatedMinutes: '', |
|||
actualMinutes: '', |
|||
chargePeoples: '', |
|||
status:null, |
|||
completionTime: '', |
|||
engineer: '', |
|||
uncompleted: '', |
|||
itemNumbers: [] |
|||
}) |
|||
const form1 = ref({ |
|||
number: "", |
|||
name: "", |
|||
qty: 0 |
|||
}) |
|||
// 时间参数 |
|||
const datetimeShow = ref(false) |
|||
const params = ref({ |
|||
year: true, |
|||
month: true, |
|||
day: true, |
|||
hour: true, |
|||
minute: true, |
|||
second: true, |
|||
timestamp: true, |
|||
}) |
|||
const datetimeDefaultValue = ref('') |
|||
const formatValue = ref('YYYY-MM-DD hh:mm:ss') |
|||
|
|||
const factoryAreaNumber = ref('') |
|||
const chooseUserList = ref([]) |
|||
// 验证正整数 |
|||
function validateInteger(value){ |
|||
if (value) { |
|||
const integerReg = /^[+]{0,1}(\d+)$/ |
|||
if (integerReg.test(value)) { |
|||
return true |
|||
} else { |
|||
return false |
|||
} |
|||
} else { |
|||
return false |
|||
} |
|||
} |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.name) { |
|||
proxy.$modal.showToast('请输入检修描述') |
|||
return; |
|||
} |
|||
if (!form.value.peoples || form.value.peoples == 0) { |
|||
proxy.$modal.showToast('请输入预估人数') |
|||
return; |
|||
} |
|||
if (!validateInteger(form.value.peoples)) { |
|||
proxy.$modal.showToast('预估人数请输入正整数') |
|||
return; |
|||
} |
|||
if (form.value.peoples > 100) { |
|||
proxy.$modal.showToast('预估人数不得超出100') |
|||
return; |
|||
} |
|||
if (!form.value.estimatedMinutes || form.value.estimatedMinutes == 0) { |
|||
proxy.$modal.showToast(`请输入预估分钟`) |
|||
return; |
|||
} |
|||
if (!validateInteger(form.value.estimatedMinutes)) { |
|||
proxy.$modal.showToast('预估分钟请输入正整数') |
|||
return; |
|||
} |
|||
if (!form.value.actualMinutes) { |
|||
proxy.$modal.showToast('请输入实际分钟') |
|||
return; |
|||
} |
|||
|
|||
if (!validateInteger(form.value.actualMinutes)) { |
|||
proxy.$modal.showToast('实际分钟请输入正整数') |
|||
return; |
|||
} |
|||
if (!form.value.chargePeoples) { |
|||
proxy.$modal.showToast('请选择负责人') |
|||
return; |
|||
} |
|||
if (!form.value.status) { |
|||
proxy.$modal.showToast('请选择完成情况') |
|||
return; |
|||
} |
|||
if (form.value.status == 0) { |
|||
if (!form.value.completionTime) { |
|||
proxy.$modal.showToast('请选择完成时间') |
|||
return; |
|||
} |
|||
} |
|||
if (form.value.status == 1) { |
|||
if (!form.value.uncompleted) { |
|||
proxy.$modal.showToast('请输入未完成原因') |
|||
return; |
|||
} |
|||
} |
|||
if (form.value.id) { |
|||
proxy.$modal.confirm('是否修改检修内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
overhaulOrderApi.overhaulOrderDetailUpdate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} else { |
|||
proxy.$modal.confirm('是否添加检修内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
overhaulOrderApi.overhaulOrderDetailCreate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value.name = '' |
|||
form.value.peoples = null |
|||
form.value.estimatedMinutes = '' |
|||
form.value.actualMinutes = '' |
|||
form.value.chargePeoples = '' |
|||
form.value.status = null |
|||
form.value.completionTime = '' |
|||
form.value.engineer = '' |
|||
form.value.uncompleted = '' |
|||
form.value.itemNumbers = [] |
|||
formatDate.value = '' |
|||
} |
|||
// 获取人员列表 |
|||
async function getSelecUser() { |
|||
let data = { |
|||
classType: type.value, |
|||
factoryAreaNumber: factoryAreaNumber.value, |
|||
flag: 0 |
|||
} |
|||
let arr = [] |
|||
if (form.value.chargePeoples) { |
|||
arr = form.value.chargePeoples.split(',') |
|||
} |
|||
await deptApi.getSelecUser(data).then(res => { |
|||
res.data.forEach(item => { |
|||
item.checked = false |
|||
arr.forEach(cur => { |
|||
if (item.id == cur) { |
|||
item.checked = true |
|||
} |
|||
}) |
|||
}) |
|||
selecUserList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开人员列表 |
|||
function openSelecUser() { |
|||
isShowSelecUser.value = true |
|||
} |
|||
function checkboxGroupChange(e) { |
|||
chooseUserList.value = e |
|||
} |
|||
// 多选选择框回显 |
|||
function selectFormatCheck(val, array) { |
|||
const arr = val.split(',').map(Number) |
|||
let str = array.filter(item => arr.includes(item.id)).map(item => item.name).join(',') |
|||
return str |
|||
} |
|||
// 选择人员 |
|||
function chooseUser() { |
|||
form.value.chargePeoples = chooseUserList.value.join(',') |
|||
isShowSelecUser.value = false |
|||
} |
|||
|
|||
const whichForm = ref() |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list, from) { |
|||
if (fieldName == 'deviceNumber' && form.value.id) return; |
|||
whichForm.value = from |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
if(whichForm.value == 'form'){ |
|||
form.value[field.value] = e[0].value |
|||
|
|||
if(field.value=='status'){ |
|||
form.value.statusTxt = e[0].label |
|||
formatDate.value = '' |
|||
} |
|||
}else if(whichForm.value == 'form1'){ |
|||
form1.value[field.value] = e[0].value |
|||
if(field.value=='number'){ |
|||
form1.value.name = e[0].label |
|||
} |
|||
} |
|||
|
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取备件列表 |
|||
async function getSparePartsList() { |
|||
await sparePartsApi.getSparePartsList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
sparePartsList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开弹窗 |
|||
function open() { |
|||
form1.value = { |
|||
number: "", |
|||
name:'', |
|||
qty: 0 |
|||
} |
|||
isPopupShow.value = true |
|||
} |
|||
// 添加配件 |
|||
function addSpare() { |
|||
if (!form1.value.number) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
if (!form1.value.qty || form1.value.qty == 0) { |
|||
proxy.$modal.showToast('请输入数量') |
|||
return; |
|||
} |
|||
if (form.value.itemNumbers && form.value.itemNumbers.length > 0) { |
|||
let arr = form.value.itemNumbers.filter(item => item.number == form1.value.number) |
|||
if (arr && arr.length > 0) { |
|||
proxy.$modal.showToast('该备件已添加') |
|||
return; |
|||
} |
|||
} |
|||
|
|||
form.value.itemNumbers.push(form1.value) |
|||
isPopupShow.value = false |
|||
} |
|||
// 删除备件 |
|||
function delSpareParts(index) { |
|||
form.value.itemNumbers.splice(index, 1) |
|||
} |
|||
function openDatetime(fieldName, val, params, format) { |
|||
params.value = params |
|||
formatValue.value = format |
|||
field.value = fieldName |
|||
form.value[field.value] = val ? val : '' |
|||
datetimeDefaultValue.value = val ? val : proxy.$time.formatDate() |
|||
datetimeShow.value = true |
|||
} |
|||
// 日期模式点击确定之后 |
|||
function chooseDatetime(e) { |
|||
console.log(e) |
|||
let array1 = [] |
|||
let array2 = [] |
|||
if (formatValue.value.indexOf('YYYY') > -1) { |
|||
array1.push(e.year) |
|||
} |
|||
if (formatValue.value.indexOf('MM') > -1) { |
|||
array1.push(e.month) |
|||
} |
|||
if (formatValue.value.indexOf('DD') > -1) { |
|||
array1.push(e.day) |
|||
} |
|||
if (formatValue.value.indexOf('hh') > -1) { |
|||
array2.push(e.hour) |
|||
} |
|||
if (formatValue.value.indexOf('mm') > -1) { |
|||
array2.push(e.minute) |
|||
} |
|||
if (formatValue.value.indexOf('ss') > -1) { |
|||
array2.push(e.second) |
|||
} |
|||
let str = array1.join('-') + ' ' + array2.join(':') |
|||
formatDate.value = str |
|||
form.value[field.value] = e.timestamp*1000 |
|||
console.log(form.value[field.value] ) |
|||
} |
|||
onLoad(async(option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.factoryAreaNumber) factoryAreaNumber.value = option.factoryAreaNumber; |
|||
if (option.number) form.value.number = option.number; |
|||
if (option.data && JSON.parse(decodeURIComponent(option.data)) && JSON.parse(decodeURIComponent(option |
|||
.data)).id) { |
|||
form.value = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value.itemNumbers = form.value.items |
|||
formatDate.value = form.value.completionTime ? proxy.$time.formatDate(form.value.completionTime) : '' |
|||
form.value.statusTxt = form.value.status == 0 ? '完成' :'未完成' |
|||
}; |
|||
jxDetailsStatus.value = await dictApi.getDict('jx_details_status') |
|||
|
|||
await getSelecUser() |
|||
await getSparePartsList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 30rpx 140rpx; |
|||
} |
|||
|
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.title { |
|||
padding: 32rpx 0px; |
|||
position: relative; |
|||
|
|||
span { |
|||
position: absolute; |
|||
left: -16rpx; |
|||
color: #fa3534; |
|||
padding-top: 6rpx; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 60rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-checkbox-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,460 @@ |
|||
<template> |
|||
<!-- 详情 --> |
|||
<view class="detail-container"> |
|||
<view class="info"> |
|||
<view class="title"> |
|||
<view>检修工单</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view class="dec-item"> |
|||
<view>工单单号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>维修工单:</view> |
|||
<view>{{data.maintenanceNumber}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>故障类型:</view> |
|||
<view>{{data.faultTypeName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.createTime"> |
|||
<view>创建时间:</view> |
|||
<view>{{$time.formatDate(data.createTime)}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>检修人员:</view> |
|||
<view>{{data.maintenanceName}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<div class="line"></div> |
|||
<view class="info" style="padding-bottom: 130rpx;"> |
|||
<view class="tab"> |
|||
<u-tabs :list="list" :is-scroll="false" bar-height="2" bar-width="250" v-model="current" |
|||
@change="change"></u-tabs> |
|||
</view> |
|||
|
|||
<view> |
|||
<view class="title"> |
|||
<view>{{changeItem.name}}</view> |
|||
</view> |
|||
<view class="dec" v-if="current == 0"> |
|||
<view class="dec-item"> |
|||
<view>设备编号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备名称:</view> |
|||
<view>{{data.name}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>所属厂区:</view> |
|||
<view>{{data.factoryAreaName}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备类型:</view> |
|||
<view>{{data.type == 'DEVICE'?'设备':data.type == 'TECH'?'工艺':'模具'}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="list" v-if="current == 1"> |
|||
<view class="item " v-for="(item,index) in serviceList" :key="index" |
|||
@click="addSubForm('updata',item)"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="" @click.stop="delService(item)"> |
|||
<u-icon name="trash" color="#aaaaaa" size="40"></u-icon> |
|||
</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>预估人数:</view> |
|||
<view>{{item.peoples}}人</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>预估分钟:</view> |
|||
<view>{{item.estimatedMinutes}}分钟</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>实际分钟:</view> |
|||
<view>{{item.actualMinutes}}分钟</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>责任人:</view> |
|||
<view>{{item.chargePeoplesName}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>完成情况:</view> |
|||
<view> |
|||
{{item.status===0 || item.status === '0'? '完成':item.status===1 ||item.status === '1'?'未完成':''}} |
|||
</view> |
|||
</view> |
|||
<view class="dec2" v-if='item.status === 0 || item.status === "0"'> |
|||
<view>完成时间:</view> |
|||
<view>{{$time.formatDate(item.completionTime)}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>工程师确认:</view> |
|||
<view>{{item.engineer}}</view> |
|||
</view> |
|||
<view class="dec2" v-if="item.status === 1 || item.status === '1'"> |
|||
<view>未完成原因:</view> |
|||
<view>{{item.uncompleted}}</view> |
|||
</view> |
|||
<view class="" v-show="item.items&&item.items.length>0"> |
|||
<view class="dec2"> |
|||
备件: |
|||
</view> |
|||
<view class="items" v-for="(cur,key) in item.items" :key="key"> |
|||
<view class="items-name"> |
|||
{{cur.name}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
备件编号:{{cur.number}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
数量:{{cur.qty}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<!-- <u-icon name="minus-circle" color="#aaaaaa" size="60" ></u-icon> --> |
|||
</view> |
|||
<view class="add-btn" v-if="data.status == 'PROCCED'"> |
|||
<u-button type="primary" @click="addSubForm('creat')"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加检修内容</u-button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<u-button type="primary" v-if="data.status == 'PROCCED'" @click="orderClick()" :loading='loading' |
|||
:disabled='loading'>完成</u-button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as overhaulOrderApi from "@/api/overhaulOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
|
|||
const list = ref([{ |
|||
name: '设备信息' |
|||
}, { |
|||
name: '检修内容' |
|||
}]) |
|||
const current = ref(0) |
|||
const changeItem = ref({ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}) |
|||
const data = ref() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const serviceList = ref([]) |
|||
|
|||
function change(index) { |
|||
current.value = index |
|||
changeItem.value = list.value[current.value] |
|||
} |
|||
// 添加表格表单 |
|||
function addSubForm(clickType, item) { |
|||
if (data.value.status == 'PENDING') { |
|||
proxy.$modal.showToast('请先接单') |
|||
return |
|||
} |
|||
if (clickType == 'updata') { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/overhaulOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}&data=${encodeURIComponent(JSON.stringify(item))}` |
|||
) |
|||
} else { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/overhaulOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}` |
|||
) |
|||
} |
|||
} |
|||
// APP维修工单接单、点击完成、验证 |
|||
function orderClick() { |
|||
if (!serviceList.value || serviceList.value && serviceList.value.length == 0) { |
|||
proxy.$modal.showToast('请添加检修内容') |
|||
return; |
|||
} |
|||
const paramseData = { |
|||
// number: data.number, |
|||
// status: data.status, |
|||
id: data.value.id, |
|||
// requestNumber: '' |
|||
} |
|||
let tips = '是否完成' |
|||
proxy.$modal.confirm(tips).then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
overhaulOrderApi.orderClick(paramseData).then((res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('操作成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('操作失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
// 获取维修内容列表 |
|||
function getOverhaulOrderDetailList() { |
|||
overhaulOrderApi.overhaulOrderDetailList({ |
|||
number: data.value.number |
|||
}).then((res) => { |
|||
if (res.data) { |
|||
serviceList.value = res.data |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
// 删除维修内容 |
|||
function delService(item) { |
|||
proxy.$modal.confirm('确定删除维修内容吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
overhaulOrderApi.overhaulOrderDetailDelete(item.id).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
getOverhaulOrderDetailList() |
|||
}).catch(() => { }) |
|||
}) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.data) { |
|||
data.value = JSON.parse(decodeURIComponent(option.data)) |
|||
|
|||
} |
|||
changeItem.value = list.value[current.value] |
|||
|
|||
}) |
|||
onShow(() => { |
|||
getOverhaulOrderDetailList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.detail-container { |
|||
min-height: 100vh; |
|||
background: white; |
|||
} |
|||
|
|||
.line { |
|||
background: #f5f5f5; |
|||
height: 20rpx; |
|||
} |
|||
|
|||
.info { |
|||
background: white; |
|||
} |
|||
|
|||
|
|||
.tab { |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
} |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
flex: 1; |
|||
border-left: 10rpx solid #409eff; |
|||
padding-left: 20rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding: 30rpx; |
|||
|
|||
.dec-item { |
|||
padding-bottom: 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 160rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec2 { |
|||
padding: 10rpx 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 180rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
.items { |
|||
margin: 20rpx 30rpx; |
|||
border-radius: 12rpx; |
|||
background: #F5F5F5; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.items-name { |
|||
padding: 20rpx; |
|||
border-bottom: 1px solid #dedede; |
|||
} |
|||
|
|||
.items-dec { |
|||
padding: 0px 20rpx; |
|||
margin-top: 20rpx; |
|||
} |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 0rpx 60rpx 0rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
background: white; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
padding: 20rpx; |
|||
box-shadow: 0px -2rpx 20rpx rgba(0, 0, 0, 0.1); |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
margin: 0px 10rpx; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 8rpx; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 20rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
border-radius: 12rpx; |
|||
border: 1px solid #dedede; |
|||
border-radius: 12rpx; |
|||
|
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
display: flex; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
flex: 1; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 0rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
</style> |
@ -0,0 +1,234 @@ |
|||
<template> |
|||
<!-- 检修工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="检修工单"> |
|||
<template v-slot:right> |
|||
<u-icon name="plus" color="#fff" size="36" style="padding-right: 30rpx;" @click="addForm"></u-icon> |
|||
</template> |
|||
</u-navbar> |
|||
<!-- <Search @search='search' @screen='screen'/> --> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" > |
|||
<view class="" @click="itemClick(item,index)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
|||
</view> |
|||
<view class="dec"> |
|||
检修单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec" v-if="item.maintenanceNumber"> |
|||
维修工单:<span>{{item.maintenanceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
<!-- <view class="status"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" @click="addForm(item)">编辑</u-button> |
|||
</view> --> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as overhaulOrderApi from "@/api/overhaulOrder.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function itemClick(item, index) { |
|||
proxy.$tab.navigateTo(`/pages/overhaulOrder/detail?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
function addForm(item) { |
|||
proxy.$tab.navigateTo(`/pages/overhaulOrder/addForm?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
|
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await overhaulOrderApi.overhaulOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,260 @@ |
|||
<template> |
|||
<!-- 维修工单 --> |
|||
<view class="container"> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in repairOrderList" :key="index" @click="chooseItem(item)"> |
|||
<u-checkbox v-model="item.checked" shape="circle" style="margin-top: 8rpx;"></u-checkbox> |
|||
<view class="right"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' |
|||
color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' |
|||
color='#e01f54' border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' |
|||
color='#005eaa' border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' |
|||
color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' |
|||
color='#2ba471' border-color='#2ba471' type="info" shape='circle' /> |
|||
</view> |
|||
<view class="dec"> |
|||
工单单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
类型:<span>{{item.type=='DEVICE'?'设备':item.type=='TECH'?'工艺':'模具'}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
班次:<span>{{item.classesName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="sure" @click="sure"> 确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
|
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
const { proxy } = getCurrentInstance() |
|||
|
|||
const repairOrderList = ref([]) |
|||
const type = ref('') |
|||
|
|||
// 获取设备保修列表 |
|||
function getList() { |
|||
proxy.$modal.loading('加载中') |
|||
repairOrderApi.repairOrderList({ |
|||
type: type.value, |
|||
result: 'TEMPORARILY' |
|||
}).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
res.data.forEach(item=>{ |
|||
item.checked = false |
|||
}) |
|||
repairOrderList.value = res.data |
|||
}) |
|||
} |
|||
function chooseItem(item){ |
|||
let arr = repairOrderList.value.filter(cur=>cur.id != item.id) |
|||
arr.forEach(item=>{ |
|||
item.checked = false |
|||
}) |
|||
item.checked = !item.checked |
|||
} |
|||
function sure(){ |
|||
let data =repairOrderList.value.filter(cur=>cur.checked)[0] |
|||
uni.$emit('chooseOrder',data) |
|||
proxy.$tab.navigateBack() |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) type.value = option.type; |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
padding-bottom: 120rpx; |
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
display: flex; |
|||
align-items: flex-start; |
|||
.right{ |
|||
flex: 1; |
|||
} |
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
</style> |
@ -0,0 +1,493 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="故障描述" prop="describes" required> |
|||
<u-input v-model="form.describes" placeholder="请输入故障描述" :disabled="form&&form.id?true:false" /> |
|||
</u-form-item> |
|||
<u-form-item label="类型" prop="type" required> |
|||
<view class="select" @click="openSingleColumn('type',form.type,appDeviceMoldType)"> |
|||
<view class="input" v-if='form.type'> |
|||
{{form.typeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<!-- <u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}名称`" prop="deviceNumber" required> |
|||
<view class="select" @click="openSingleColumn('deviceNumber',form.deviceNumber,deviceList)"> |
|||
<view class="input" v-if='form.deviceName'> |
|||
{{form.deviceName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请输入${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}名称`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> --> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" prop="deviceNumber" required> |
|||
<u-input v-model="form.deviceNumber" :placeholder="`请输入${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码`" |
|||
@blur="blur()" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}名称`" prop="deviceNumber" required |
|||
class="disabled"> |
|||
<u-input v-model="form.deviceName" :placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" |
|||
disabled /> |
|||
</u-form-item> |
|||
<u-form-item :label="`厂区编码`" prop="factoryAreaNumber" required class="disabled"> |
|||
<u-input v-model="form.factoryAreaNumber" |
|||
:placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" disabled /> |
|||
</u-form-item> |
|||
<u-form-item :label="`厂区名称`" prop="factoryAreaName" required class="disabled"> |
|||
<u-input v-model="form.factoryAreaName" |
|||
:placeholder="`根据${type=='DEVICE'||type == 'TECH'?'设备' : '模具'}编码获得`" disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="班次" prop="classes" required> |
|||
<view class="select" @click="openSingleColumn('classes',form.classes,maintenanceShift)"> |
|||
<view class="input" v-if='(form.classes||form.classes==0)&&maintenanceShift.length>0'> |
|||
{{form.classesName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择班次`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="故障类型" prop="classes" required> |
|||
<view class="select" @click="openSingleColumn('faultType',form.faultType,faultType)"> |
|||
<view class="input" v-if='form.faultType'> |
|||
{{form.faultTypeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择故障类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn"></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as deviceApi from "@/api/device.js" |
|||
import * as moldApi from "@/api/mold.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
|
|||
const loading = ref(false) |
|||
const appDeviceMoldType = ref([]) |
|||
const type = ref('') |
|||
const form = ref({ |
|||
id: '', |
|||
describes: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
factoryAreaName: '', |
|||
factoryAreaNumber: '', |
|||
classes: '', |
|||
type: '', |
|||
faultType: '' |
|||
}) |
|||
|
|||
const deviceList = ref([]) |
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const maintenanceShift = ref([]) |
|||
const faultType = ref([]) |
|||
const choosesingleColumnItem = ref() |
|||
const msg = ref('') |
|||
// 扫描设备条码 |
|||
function chickRightButton(field) { |
|||
if (!form.value.type) { |
|||
proxy.$modal.showToast('请先选择类型') |
|||
return; |
|||
} |
|||
uni.scanCode({ |
|||
success: function (res) { |
|||
form.value.deviceNumber = res.result |
|||
getDetailsByNumber() |
|||
} |
|||
}); |
|||
} |
|||
function blur() { |
|||
if (form.value.deviceNumber) { |
|||
getDetailsByNumber() |
|||
} else { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
} |
|||
} |
|||
// 根据设备/模具号查询信息 |
|||
function getDetailsByNumber() { |
|||
if (type.value == 'DEVICE' || type.value == 'TECH') { |
|||
deviceApi.getDeviceDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
type: type.value |
|||
}).then((res) => { |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch(() => { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} else if (type.value == 'MOLD') { |
|||
moldApi.getMoldDetailsByNumber({ |
|||
number: form.value.deviceNumber |
|||
}).then(res => { |
|||
if (!res.data) { |
|||
msg.value = res.msg |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
}).catch(() => { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
}) |
|||
} |
|||
} |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.describes) { |
|||
proxy.$modal.showToast('请输入故障描述') |
|||
return; |
|||
} |
|||
if (!form.value.deviceNumber) { |
|||
proxy.$modal.showToast(`请选择${type.value == 'DEVICE' || type.value == 'TECH' ? '设备' : '模具'}名称`) |
|||
return; |
|||
} |
|||
if (!form.value.deviceName) { |
|||
proxy.$modal.showToast(msg.value) |
|||
return; |
|||
} |
|||
if (!form.value.factoryAreaName) { |
|||
proxy.$modal.showToast('请输入区域') |
|||
return; |
|||
} |
|||
if (!form.value.classes) { |
|||
proxy.$modal.showToast('请选择班次') |
|||
return; |
|||
} |
|||
const data = { |
|||
id: form.value && form.value.id ? form.value.id : '', |
|||
describes: form.value.describes, |
|||
type: form.value.type, |
|||
deviceNumber: form.value.deviceNumber, |
|||
factoryAreaNumber: form.value.factoryAreaNumber, |
|||
classes: form.value.classes, |
|||
faultType: form.value.faultType |
|||
} |
|||
if (form.value.id) { |
|||
proxy.$modal.confirm('是否修改维修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
repairOrderApi.repairOrderUpdate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} else { |
|||
proxy.$modal.confirm('是否添加维修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
repairOrderApi.repairOrderCreate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
if (form.value.id) { |
|||
form.value.classes = undefined; |
|||
form.value.faultType = undefined |
|||
} else { |
|||
form.value = {} |
|||
} |
|||
} |
|||
|
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
if ((fieldName == 'deviceNumber' || fieldName == 'type') && form.value.id) return; |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form.value[field.value] = e[0].value |
|||
if (field.value == 'deviceNumber') { |
|||
choosesingleColumnItem.value = singleColumnList.value.filter(item => item.number == e[0].value) |
|||
form.value.factoryAreaName = choosesingleColumnItem.value[0].factoryAreaName |
|||
form.value.factoryAreaNumber = choosesingleColumnItem.value[0].factoryAreaNumber |
|||
form.value.deviceName = choosesingleColumnItem.value[0].name |
|||
}else if(field.value == 'classes'){ |
|||
form.value.classesName =e[0].label |
|||
}else if(field.value == 'faultType'){ |
|||
form.value.faultTypeName =e[0].label |
|||
}else if(field.value == 'type'){ |
|||
form.value.typeName =e[0].label |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取设备/模具列表 |
|||
async function getDeviceList() { |
|||
if (type.value == 'DEVICE') { |
|||
await deviceApi.deviceList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}).catch(() => { }) |
|||
} else if (type.value == 'MOLD') { |
|||
await moldApi.moldList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
|
|||
} |
|||
const appDeviceMoldType1 = ref([]) |
|||
onLoad(async option => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.data) { |
|||
let data = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value = { |
|||
id: data.id, |
|||
describes: data.describes, |
|||
deviceNumber: data.deviceNumber, |
|||
deviceName: data.name, |
|||
factoryAreaName: data.factoryAreaName, |
|||
factoryAreaNumber: data.factoryAreaNumber, |
|||
classes: data.classes || data.classes == 0 ? data.classes : undefined, |
|||
faultType: data.faultType, |
|||
type: data.type |
|||
} |
|||
}; |
|||
await getDeviceList() |
|||
maintenanceShift.value = await dictApi.getDict('maintenance_shift') |
|||
appDeviceMoldType1.value = await dictApi.getDict('app_device_mold_type') |
|||
faultType.value = await dictApi.getDict('fault_type') |
|||
if (type.value == 'MOLD') { |
|||
appDeviceMoldType.value = appDeviceMoldType1.value.filter((item => item.value == "MOLD")) |
|||
} else { |
|||
appDeviceMoldType.value = [] |
|||
|
|||
if(store.roles.some(item=>item.indexOf('device')>-1)){ |
|||
appDeviceMoldType.value = appDeviceMoldType1.value.filter((item => item.value == "DEVICE")) |
|||
} |
|||
if(store.roles.some(item=>item.indexOf('tech')>-1)){ |
|||
appDeviceMoldType.value = appDeviceMoldType1.value.filter((item => item.value == "TECH")) |
|||
} |
|||
if(store.roles.some(item=>item.indexOf('tech')>-1&&item.indexOf('device')>-1)){ |
|||
appDeviceMoldType.value = appDeviceMoldType1.value.filter((item => item.value != "MOLD")) |
|||
} |
|||
} |
|||
|
|||
form.value.type = appDeviceMoldType.value[0].value |
|||
form.value.typeName = appDeviceMoldType.value[0].label |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
image { |
|||
width: 160rpx; |
|||
height: 160rpx; |
|||
margin-right: 20rpx; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,503 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="故障描述" prop="describes" required> |
|||
<u-input v-model="form.describes" placeholder="请输入故障描述" /> |
|||
</u-form-item> |
|||
<u-form-item label="故障真因" prop="describes" required> |
|||
<u-input v-model="form.describes1" placeholder="请输入故障真因" /> |
|||
</u-form-item> |
|||
<u-form-item label="解决措施" prop="describes" required> |
|||
<u-input type='textarea' v-model="form.workOut" placeholder="请输入解决措施" /> |
|||
</u-form-item> |
|||
<u-form-item label="维修人员" prop="describes" required> |
|||
<view class="select" @click="openSelecUser"> |
|||
<view class="input" v-if='form.maintenances'> |
|||
{{selectFormatCheck(form.maintenances,selecUserList)}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择维修人员 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="list"> |
|||
<view class="title"> |
|||
<span></span>备件 |
|||
</view> |
|||
<view class="item " v-for="(item,index) in form.itemNumbers" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="12"> |
|||
<view class="dec"> |
|||
<view class=""> |
|||
数量:{{item.qty}} |
|||
</view> |
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
<u-icon name="minus-circle" color="#aaaaaa" size="60" @click="delSpareParts(index)"></u-icon> |
|||
</view> |
|||
<view class="add-btn"> |
|||
<u-button type="primary" @click="open"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加备件</u-button> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 添加备件 --> |
|||
<u-popup v-model="isPopupShow" mode="center" border-radius="14"> |
|||
<view class="popup-title">添加备件</view> |
|||
<view class="popup"> |
|||
<u-form :model="form1" ref="form1Ref" label-width="160rpx"> |
|||
<u-form-item :label="`备件`" prop="number" required> |
|||
<view class="select" @click="openSingleColumn('number',form1.number,sparePartsList)"> |
|||
<view class="input" v-if='form1.number'> |
|||
{{form1.name}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择备件 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="数量" prop="qty" required> |
|||
<u-input v-model="form1.qty" type="number" placeholder="请输入数量" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isPopupShow = false">取消</view> |
|||
<view class="sure" @click="addSpare">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<!-- 选择维修人员 --> |
|||
<u-popup v-model="isShowSelecUser" mode="center" border-radius="14"> |
|||
<view class="popup-title">选择维修人员</view> |
|||
<view class="popup"> |
|||
<u-checkbox-group @change="checkboxGroupChange"> |
|||
<u-checkbox v-model="item.checked" v-for="(item, index) in selecUserList" :key="index" |
|||
:name="item.id">{{item.name}}</u-checkbox> |
|||
</u-checkbox-group> |
|||
|
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isShowSelecUser = false">取消</view> |
|||
<view class="sure" @click="chooseUser">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import * as deptApi from "@/api/dept.js" |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
|
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const isPopupShow = ref(false) |
|||
const sparePartsList = ref([]) |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
|
|||
const selecUserList = ref([]) |
|||
const isShowSelecUser = ref(false) |
|||
const form = ref({ |
|||
number: '', |
|||
describes: '', |
|||
describes1: '', |
|||
workOut: '', |
|||
maintenances: '', |
|||
itemNumbers: [], |
|||
}) |
|||
const form1 = ref({ |
|||
number: "", |
|||
name:"", |
|||
qty: 0 |
|||
}) |
|||
|
|||
const factoryAreaNumber = ref('') |
|||
const chooseUserList = ref([]) |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.describes) { |
|||
proxy.$modal.showToast('请输入故障描述') |
|||
return; |
|||
} |
|||
if (!form.value.describes1) { |
|||
proxy.$modal.showToast(`请输入故障真因`) |
|||
return; |
|||
} |
|||
if (!form.value.workOut) { |
|||
proxy.$modal.showToast('请输入解决措施') |
|||
return; |
|||
} |
|||
if (!form.value.maintenances) { |
|||
proxy.$modal.showToast('请选择维修人员') |
|||
return; |
|||
} |
|||
if (form.value.id) { |
|||
proxy.$modal.confirm('是否修改维修内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
repairOrderApi.repairOrderDetailUpdate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} else { |
|||
proxy.$modal.confirm('是否添加维修内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
repairOrderApi.repairOrderDetailCreate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value.describes = '' |
|||
form.value.describes1 = '' |
|||
form.value.workOut = '' |
|||
form.value.maintenances = '' |
|||
form.value.itemNumbers = [] |
|||
} |
|||
|
|||
// 获取人员列表 |
|||
async function getSelecUser() { |
|||
let data = { |
|||
classType: type.value, |
|||
// factoryAreaNumber: factoryAreaNumber.value |
|||
} |
|||
let arr = [] |
|||
if (form.value.maintenances) { |
|||
arr = form.value.maintenances.split(',') |
|||
} |
|||
await deptApi.getSelecUser(data).then(res => { |
|||
res.data.forEach(item => { |
|||
item.checked = false |
|||
arr.forEach(cur => { |
|||
if (item.id == cur) { |
|||
item.checked = true |
|||
} |
|||
}) |
|||
}) |
|||
selecUserList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开人员列表 |
|||
function openSelecUser() { |
|||
isShowSelecUser.value = true |
|||
} |
|||
function checkboxGroupChange(e) { |
|||
chooseUserList.value = e |
|||
} |
|||
// 多选选择框回显 |
|||
function selectFormatCheck(val, array) { |
|||
const arr = val.split(',').map(Number) |
|||
let str = array.filter(item => arr.includes(item.id)).map(item => item.name).join(',') |
|||
return str |
|||
} |
|||
// 选择人员 |
|||
function chooseUser() { |
|||
form.value.maintenances = chooseUserList.value.join(',') |
|||
isShowSelecUser.value = false |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
if (fieldName == 'deviceNumber' && form.value.id) return; |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form1.value[field.value] = e[0].value |
|||
if(field.value=='number'){ |
|||
form1.value.name = e[0].label |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取备件列表 |
|||
async function getSparePartsList() { |
|||
await sparePartsApi.getSparePartsList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
sparePartsList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开弹窗 |
|||
function open() { |
|||
form1.value = { |
|||
number: "", |
|||
name:'', |
|||
qty: 0 |
|||
} |
|||
isPopupShow.value = true |
|||
} |
|||
// 添加配件 |
|||
function addSpare() { |
|||
if (!form1.value.number) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
if (!form1.value.qty || form1.value.qty == 0) { |
|||
proxy.$modal.showToast('请输入数量') |
|||
return; |
|||
} |
|||
if (form.value.itemNumbers && form.value.itemNumbers.length > 0) { |
|||
let arr = form.value.itemNumbers.filter(item => item.number == form1.value.number) |
|||
if (arr && arr.length > 0) { |
|||
proxy.$modal.showToast('该备件已添加') |
|||
return; |
|||
} |
|||
} |
|||
|
|||
form.value.itemNumbers.push(form1.value) |
|||
isPopupShow.value = false |
|||
} |
|||
// 删除备件 |
|||
function delSpareParts(index) { |
|||
form.value.itemNumbers.splice(index, 1) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.factoryAreaNumber) factoryAreaNumber.value = option.factoryAreaNumber; |
|||
if (option.number) form.value.number = option.number; |
|||
if (option.data && JSON.parse(decodeURIComponent(option.data)) && JSON.parse(decodeURIComponent(option |
|||
.data)).id) { |
|||
form.value = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value.itemNumbers = form.value.items |
|||
}; |
|||
await getSelecUser() |
|||
await getSparePartsList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 30rpx 140rpx; |
|||
} |
|||
|
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.title { |
|||
padding: 32rpx 0px; |
|||
position: relative; |
|||
|
|||
span { |
|||
position: absolute; |
|||
left: -16rpx; |
|||
color: #fa3534; |
|||
padding-top: 6rpx; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 60rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-checkbox-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,792 @@ |
|||
<template> |
|||
<!-- 详情 --> |
|||
<view class="detail-container"> |
|||
<view class="info"> |
|||
<view class="title"> |
|||
<view>维修工单</view> |
|||
<view @click="transfer" |
|||
v-if="data.status == 'PECEIVED' && (!serviceList || serviceList && serviceList.length == 0)">转办 |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view class="dec-item"> |
|||
<view>工单单号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>报修描述:</view> |
|||
<view>{{data.describes}}</view> |
|||
</view> |
|||
<u-form :model="data" ref="form1" label-width="160rpx" |
|||
style="border-top: 1px solid rgba(220,220,220,0.5);border-bottom: 1px solid rgba(220,220,220,0.5);margin-bottom: 20rpx;" |
|||
v-if="data.status == 'PECEIVED'"> |
|||
<u-form-item label="班次" prop="classes" required> |
|||
<view class="select" @click="openSingleColumn('classes',data.classes,maintenanceShift)"> |
|||
<view class="input" v-if='data.classes||data.classes==0'> |
|||
{{data.classesName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择班次`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="故障类型" prop="classes" required> |
|||
<view class="select" @click="openSingleColumn('faultType',data.faultType,faultType)"> |
|||
<view class="input" v-if='data.faultType'> |
|||
{{data.faultTypeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择故障类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="dec-item" v-if="data.status != 'PECEIVED'"> |
|||
<view>班次:</view> |
|||
<view>{{data.classesName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.status != 'PECEIVED'"> |
|||
<view>故障类型:</view> |
|||
<view>{{data.faultTypeName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.createTime"> |
|||
<view>创建时间:</view> |
|||
<view>{{$time.formatDate(data.createTime)}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.creator"> |
|||
<view>创建人员:</view> |
|||
<view>{{data.creator}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.receivingTime"> |
|||
<view>接单时间:</view> |
|||
<view>{{$time.formatDate(data.receivingTime)}}</view> |
|||
</view> |
|||
|
|||
<view class="dec-item" v-if="data.maintenanceName"> |
|||
<view>接单人员:</view> |
|||
<view>{{data.maintenanceName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.completionTime"> |
|||
<view>完成时间:</view> |
|||
<view>{{$time.formatDate(data.completionTime)}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.verifyTime"> |
|||
<view>验证时间:</view> |
|||
<view>{{$time.formatDate(data.verifyTime)}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.verifyer"> |
|||
<view>验证人员:</view> |
|||
<view>{{data.verifyer}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<div class="line"></div> |
|||
<view class="info" style="padding-bottom: 130rpx;"> |
|||
<view class="tab"> |
|||
<u-tabs :list="list" :is-scroll="false" bar-height="2" bar-width="250" v-model="current" |
|||
@change="change"></u-tabs> |
|||
</view> |
|||
|
|||
<view> |
|||
<view class="title"> |
|||
<view>{{changeItem.name}}</view> |
|||
</view> |
|||
<view class="dec" v-if="changeItem.value == 1"> |
|||
<view class="dec-item"> |
|||
<view>设备编号:</view> |
|||
<view>{{data.deviceNumber}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备名称:</view> |
|||
<view>{{data.name}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>所属厂区:</view> |
|||
<view>{{data.factoryAreaName}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备类型:</view> |
|||
<view>{{data.type == 'DEVICE'?'设备':data.type == 'TECH'?'工艺':'模具'}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="dec" v-if="changeItem.value == 2"> |
|||
<view class="dec-item"> |
|||
<view>报修单号:</view> |
|||
<view>{{data1.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>报修描述:</view> |
|||
<view>{{data1.describes}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>报修人:</view> |
|||
<view>{{data1.declarName}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>报修时间:</view> |
|||
<view>{{$time.formatDate(data.createTime)}}</view> |
|||
</view> |
|||
<!-- <view>图片:</view> --> |
|||
<view class="images"> |
|||
<image :src="cur" mode="" v-for="(cur,key) in data1.filePathList" :key='key' |
|||
@click="previewImage(key,data1.filePathList)"></image> |
|||
</view> |
|||
</view> |
|||
<view class="list" v-if="changeItem.value == 3"> |
|||
<view class="item " v-for="(item,index) in serviceList" :key="index" |
|||
@click.stop="addSubForm('updata',item)"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<view class="" @click.stop="delService(item)"> |
|||
<u-icon name="trash" color="#aaaaaa" size="40" |
|||
v-if="data.status == 'PENDING' || data.status == 'PECEIVED'" |
|||
></u-icon> |
|||
</view> |
|||
|
|||
</view> |
|||
<view class="dec2"> |
|||
<view>故障真因:</view> |
|||
<view>{{item.describes1}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>解决措施:</view> |
|||
<view>{{item.workOut}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>维修人员:</view> |
|||
<view>{{item.maintenancesName}}</view> |
|||
</view> |
|||
<view class="" v-show="item.items&&item.items.length>0"> |
|||
<view class="dec2"> |
|||
备件: |
|||
</view> |
|||
<view class="items" v-for="(cur,key) in item.items" :key="key"> |
|||
<view class="items-name"> |
|||
{{cur.name}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
备件编号:{{cur.number}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
数量:{{cur.qty}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<!-- <u-icon name="minus-circle" color="#aaaaaa" size="60" ></u-icon> --> |
|||
</view> |
|||
<view class="add-btn" |
|||
v-if="data.status == 'PENDING' || data.status == 'PECEIVED'"> |
|||
<u-button type="primary" @click="addSubForm('creat')"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加维修内容</u-button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns" v-if="data.status == 'PENDING'"> |
|||
<u-button type="primary" @click="orderClick(1)" :loading='loading' :disabled='loading'>接单</u-button> |
|||
</view> |
|||
|
|||
<view class="btns" v-if="data.status == 'PECEIVED'"> |
|||
<u-button shape="shape" type="warning" style="min-width: 120rpx;" :loading='loading1' @click="editForm" |
|||
:disabled='loading1'>修改工单</u-button> |
|||
<u-button type="primary" @click="orderClickSuccess()" :loading='loading' |
|||
:disabled='loading'>完成</u-button> |
|||
</view> |
|||
<view class="btns" v-if="data.status == 'COMPLETED'"> |
|||
<u-button type="primary" @click="orderClick(3)" :loading='loading' :disabled='loading'>验证完结</u-button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 完成类型 --> |
|||
<u-popup v-model="isShowSuccess" mode="center" border-radius="14"> |
|||
<view class="popup-title">完成类型</view> |
|||
<view class="popup"> |
|||
<u-radio-group v-model="result" @change="radioGroupChange"> |
|||
<u-radio v-for="(item, index) in orderCompleteResult" :key="index" :name="item.value"> |
|||
{{item.label}} |
|||
</u-radio> |
|||
</u-radio-group> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isShowSuccess = false">取消</view> |
|||
<view class="sure" @click="sure">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn"></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
|
|||
const list = ref([{ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}, { |
|||
name: '报修信息', |
|||
value: 2 |
|||
}, { |
|||
name: '维修内容', |
|||
value: 3 |
|||
}]) |
|||
const current = ref(0) |
|||
const changeItem = ref({ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}) |
|||
const data = ref() |
|||
const loading = ref(false) |
|||
const loading1 = ref(false) |
|||
const type = ref('') |
|||
const serviceList = ref([]) |
|||
const isShowSuccess = ref(false) |
|||
const orderCompleteResult = ref([]) //订单完成类型 |
|||
const result = ref('TEMPORARILY') |
|||
const data1 = ref('') |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const maintenanceShift = ref([]) //班次字典项 |
|||
const faultType = ref([]) //故障类型字典项 |
|||
function change(index) { |
|||
current.value = index |
|||
changeItem.value = list.value[current.value] |
|||
} |
|||
// 添加表格表单 |
|||
function addSubForm(clickType, item) { |
|||
if (data.value.status == 'PENDING') { |
|||
proxy.$modal.showToast('请先接单') |
|||
return |
|||
} |
|||
if (clickType == 'updata') { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/repairOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}&data=${encodeURIComponent(JSON.stringify(item))}` |
|||
) |
|||
} else { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/repairOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}` |
|||
) |
|||
} |
|||
} |
|||
|
|||
// 完成按钮 |
|||
function orderClickSuccess() { |
|||
// 如果点击完成是否与接单人员一致 |
|||
if (data.value.status == 'PECEIVED') { |
|||
if (store.id != data.value.maintenance) { |
|||
proxy.$modal.showToast('当前人员与接单人员不一致') |
|||
return; |
|||
} |
|||
|
|||
if (!serviceList.value || serviceList.value && serviceList.value.length == 0) { |
|||
proxy.$modal.showToast('请添加维修内容') |
|||
return; |
|||
} |
|||
if (!data.value.classesName || !data.value.faultTypeName) { |
|||
proxy.$modal.showToast('请完善班次和故障类型') |
|||
return; |
|||
} |
|||
} |
|||
isShowSuccess.value = true |
|||
} |
|||
function radioGroupChange(e) { |
|||
result.value = e |
|||
} |
|||
function sure() { |
|||
isShowSuccess.value = false |
|||
orderClick(2) |
|||
} |
|||
// APP维修工单接单、点击完成、验证 |
|||
async function orderClick(type) { |
|||
// 如果是接单 |
|||
// if (this.data.status == 'PENDING') { |
|||
// if (this.$store.state.user.dept.parentId != this.data.factoryAreaNumber) { |
|||
// this.$modal.showToast('当前人员厂区与工单来源的厂区不一致') |
|||
// return; |
|||
// } |
|||
// if (this.$store.state.user.dept.classType != this.data.type) { |
|||
// this.$modal.showToast('当前人员班组与工单类型不一致') |
|||
// return; |
|||
// } |
|||
// } |
|||
|
|||
|
|||
const dataOne = { |
|||
number: data.value.number, |
|||
status: data.value.status, |
|||
id: data.value.id, |
|||
result: type == 2 ? result.value : '', |
|||
requestNumber: data.value.requestNumber, |
|||
} |
|||
// 修改工单接口参数 |
|||
const dataTwo = { |
|||
id: data.value && data.value.id ? data.value.id : '', |
|||
describes: data.value.describes, |
|||
type: data.value.type, |
|||
deviceNumber: data.value.deviceNumber, |
|||
factoryAreaNumber: data.value.factoryAreaNumber, |
|||
classes: data.value.classes, |
|||
faultType: data.value.faultType |
|||
} |
|||
if(type ==2){ |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
// 如果直接点击完成先走修改工单接口 |
|||
if (data.value.status == 'PECEIVED') { |
|||
await repairOrderApi.repairOrderUpdate(dataTwo).then((res) => { }).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
} |
|||
await repairOrderApi.orderClick(dataOne).then((res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('操作成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('操作失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}else{ |
|||
let tips = data.value.status == 'PENDING' ? '是否接单?' : data.value.status == 'PECEIVED' ? '是否完成?' : data |
|||
.value.status == 'COMPLETED' ? '是否验证完结?' : '' |
|||
proxy.$modal.confirm(tips).then(async () => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
// 如果直接点击完成先走修改工单接口 |
|||
if (data.value.status == 'PECEIVED') { |
|||
await repairOrderApi.repairOrderUpdate(dataTwo).then((res) => { }).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
} |
|||
await repairOrderApi.orderClick(dataOne).then((res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('操作成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('操作失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
// 获取维修报修信息 |
|||
function getDeviceRepairDetailsByNumber() { |
|||
repairOrderApi.getDeviceRepairDetailsByNumber({ |
|||
type: data.value.type, |
|||
requestNumber: data.value.requestNumber |
|||
}).then((res) => { |
|||
if (res.data) { |
|||
data1.value = res.data |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
// 获取维修内容列表 |
|||
function getRepairOrderDetaiList() { |
|||
repairOrderApi.repairOrderDetailList({ |
|||
number: data.value.number |
|||
}).then((res) => { |
|||
if (res.data) { |
|||
serviceList.value = res.data |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
// 删除维修内容 |
|||
function delService(item) { |
|||
proxy.$modal.confirm('确定删除维修内容吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
repairOrderApi.repairOrderDetailDelete(item.id).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
getRepairOrderDetaiList() |
|||
}).catch(() => { }) |
|||
}) |
|||
} |
|||
function transfer() { |
|||
proxy.$tab.navigateTo(`/pages/repairOrder/transfer?type=${data.value.type}&id=${data.value.id}&deviceNumber=${data.value.deviceNumber}`) |
|||
} |
|||
function previewImage(current, array) { |
|||
uni.previewImage({ |
|||
urls: array, |
|||
current: current, |
|||
longPressActions: { |
|||
itemList: ['发送给朋友', '保存图片', '收藏'], |
|||
success: function (data) { |
|||
console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); |
|||
}, |
|||
fail: function (err) { |
|||
console.log(err.errMsg); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
data.value[field.value] = e[0].value |
|||
console.log(field.value) |
|||
if (field.value == 'classes') { |
|||
data.value.classesName = e[0].label |
|||
console.log(data.value.classesName) |
|||
} |
|||
if (field.value == 'faultType') { |
|||
data.value.faultTypeName = e[0].label |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
// 修改工单 |
|||
function editForm() { |
|||
const paramesData = { |
|||
id: data.value && data.value.id ? data.value.id : '', |
|||
describes: data.value.describes, |
|||
type: data.value.type, |
|||
deviceNumber: data.value.deviceNumber, |
|||
factoryAreaNumber: data.value.factoryAreaNumber, |
|||
classes: data.value.classes, |
|||
faultType: data.value.faultType |
|||
} |
|||
proxy.$modal.confirm('是否修改维修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading1.value = true |
|||
repairOrderApi.repairOrderUpdate(paramesData).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
// setTimeout(() => { |
|||
// this.$tab.navigateBack() |
|||
loading1.value = false |
|||
// }, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('修改失败') |
|||
loading1.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.data) { |
|||
data.value = JSON.parse(decodeURIComponent(option.data)) |
|||
|
|||
} |
|||
changeItem.value = list.value[current.value] |
|||
orderCompleteResult.value = await dictApi.getDict('order_complete_result') |
|||
|
|||
|
|||
}) |
|||
onShow(async () => { |
|||
if (data.value.requestNumber) { |
|||
getDeviceRepairDetailsByNumber() |
|||
list.value = [{ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}, { |
|||
name: '报修信息', |
|||
value: 2 |
|||
}, { |
|||
name: '维修内容', |
|||
value: 3 |
|||
}] |
|||
} else { |
|||
list.value = [{ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}, { |
|||
name: '维修内容', |
|||
value: 3 |
|||
}] |
|||
} |
|||
getRepairOrderDetaiList() |
|||
maintenanceShift.value = await dictApi.getDict('maintenance_shift') |
|||
faultType.value = await dictApi.getDict('fault_type') |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.detail-container { |
|||
min-height: 100vh; |
|||
background: white; |
|||
} |
|||
|
|||
.line { |
|||
background: #f5f5f5; |
|||
height: 20rpx; |
|||
} |
|||
|
|||
.info { |
|||
background: white; |
|||
} |
|||
|
|||
.tab { |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
} |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
flex: 1; |
|||
border-left: 10rpx solid #409eff; |
|||
padding-left: 20rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding: 30rpx; |
|||
|
|||
.dec-item { |
|||
padding-bottom: 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 160rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec2 { |
|||
padding: 10rpx 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 160rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
.items { |
|||
margin: 20rpx 30rpx; |
|||
border-radius: 12rpx; |
|||
background: #F5F5F5; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.items-name { |
|||
padding: 20rpx; |
|||
border-bottom: 1px solid #dedede; |
|||
} |
|||
|
|||
.items-dec { |
|||
padding: 0px 20rpx; |
|||
margin-top: 20rpx; |
|||
} |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 0rpx 60rpx 0rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
background: white; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
padding: 20rpx; |
|||
box-shadow: 0px -2rpx 20rpx rgba(0, 0, 0, 0.1); |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
margin: 0px 10rpx; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 8rpx; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 20rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
border-radius: 12rpx; |
|||
border: 1px solid #dedede; |
|||
border-radius: 12rpx; |
|||
|
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
display: flex; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
flex: 1; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 0rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
::v-deep .u-radio-group { |
|||
display: grid !important; |
|||
padding-bottom: 20rpx; |
|||
} |
|||
|
|||
.images { |
|||
display: flex; |
|||
width: 100%; |
|||
|
|||
image { |
|||
width: 30%; |
|||
margin-right: 20rpx; |
|||
height: 200rpx; |
|||
border-radius: 10rpx; |
|||
} |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<!-- 维修工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="维修工单"> |
|||
<template v-slot:right> |
|||
<u-icon name="plus" color="#fff" size="36" style="padding-right: 30rpx;" @click="addForm"></u-icon> |
|||
</template> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" > |
|||
<view class="" @click="itemClick(item,index)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
|||
</view> |
|||
<view class="dec"> |
|||
工单单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
类型:<span>{{item.type=='DEVICE'?'设备':item.type=='TECH'?'工艺':'模具'}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
班次:<span>{{item.classesName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function itemClick(item, index) { |
|||
proxy.$tab.navigateTo(`/pages/repairOrder/detail?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
function addForm(item) { |
|||
proxy.$tab.navigateTo(`/pages/repairOrder/addForm?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
|
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await repairOrderApi.repairOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,230 @@ |
|||
<template> |
|||
<!-- 维修工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="维修工单"> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" > |
|||
<view class=""> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
|||
</view> |
|||
<view class="dec"> |
|||
报修单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
班次:<span>{{item.classesName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
完成时间:<span>{{$time.formatDate(item.completionTime)}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
<!-- <view class="status"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" @click="addForm(item)">编辑</u-button> |
|||
|
|||
</view> --> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag: 1 |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await repairOrderApi.repairOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,589 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="转办类型" prop="status" required> |
|||
<view class="select" @click="openSingleColumn('status',form.status,tansferType)"> |
|||
<view class="input" v-if='form.status || form.status == 0'> |
|||
{{form.statusTxt}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择转办类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="类型" prop="receiverType" required> |
|||
<view class="select" @click="openSingleColumn('receiverType',form.receiverType,deviceMoldType)"> |
|||
<view class="input" v-if='form.receiverType'> |
|||
{{form.receiverTypeTxt}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="厂区名称" prop="factoryAreaNumber" required v-if="form.status==1"> |
|||
<view class="select" |
|||
@click="openSingleColumn('factoryAreaNumber',form.factoryAreaNumber,factoryAreaList)"> |
|||
<view class="input" v-if='form.factoryAreaNumber'> |
|||
{{form.factoryAreaName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择厂区名称`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${form.receiverType=='DEVICE'||form.receiverType == 'TECH'?'设备' : '模具'}编码`" prop="deviceNumber" required |
|||
v-if="form.status==0"> |
|||
<u-input v-model="form.deviceNumber" :placeholder="`请输入${form.receiverType=='DEVICE'||form.receiverType == 'TECH'?'设备' : '模具'}编码`" |
|||
@blur="blur()" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${form.receiverType=='DEVICE'||form.receiverType == 'TECH'?'设备' : '模具'}名称`" prop="deviceNumber" required |
|||
class="disabled" v-if="form.status==0"> |
|||
<u-input v-model="form.deviceName" :placeholder="`根据${form.receiverType=='DEVICE'||form.receiverType == 'TECH'?'设备' : '模具'}编码获得`" |
|||
disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="维修人员" prop="describes" required> |
|||
<view class="select" @click="openSelecUser('receiverUserId')"> |
|||
<view class="input" v-if='form.receiverUserId'> |
|||
{{selectFormatRadin(form.receiverUserId,selecUserList)}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择维修人员 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 选择维修人员 --> |
|||
<u-popup v-model="isShowSelecUser" mode="center" border-radius="14"> |
|||
<view class="popup-title">选择维修人员</view> |
|||
<view class="popup"> |
|||
<u-radio-group v-model="form.receiverUserId" |
|||
@change="radioGroupChange('receiverUserId',form.receiverUserId,selecUserList)"> |
|||
<u-radio v-for="(item, index) in selecUserList" :key="index" :name="item.id"> |
|||
{{item.name}} |
|||
</u-radio> |
|||
</u-radio-group> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isShowSelecUser = false">取消</view> |
|||
<view class="sure" @click="chooseUser">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as deviceApi from "@/api/device.js" |
|||
import * as moldApi from "@/api/mold.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as repairOrderApi from "@/api/repairOrder.js" |
|||
import * as deptApi from "@/api/dept.js" |
|||
const { proxy } = getCurrentInstance() |
|||
|
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const deviceMoldType = ref([]) |
|||
const deviceMoldType1 = ref([]) |
|||
const form = ref({ |
|||
id: '', |
|||
receiverType: "", |
|||
receiverTypeTxt: '', |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
receiverUserId: '', |
|||
status: 0, |
|||
statusTxt: '设备', |
|||
factoryAreaNumber: '', |
|||
factoryAreaName: '' |
|||
}) |
|||
const deviceList = ref([]) |
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
//维修人员 |
|||
const selecUserList = ref([])//维修人员 |
|||
const isShowSelecUser = ref(false) |
|||
// 转办类型 |
|||
const tansferType = ref([{ |
|||
value: 0, |
|||
label: '设备' |
|||
}, { |
|||
value: 1, |
|||
label: '人员' |
|||
}]) |
|||
const deviceNumber = ref('')//主页面设备编码 |
|||
|
|||
const factoryAreaList = ref([]) |
|||
const choosesingleColumnItem = ref([]) |
|||
const chooseUserInfo = ref({}) |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.receiverType) { |
|||
proxy.$modal.showToast('请选择类型') |
|||
return; |
|||
} |
|||
if (form.value.status == 0) { |
|||
if (!form.value.deviceNumber) { |
|||
proxy.$modal.showToast(`请选择${form.value.receiverType == 'DEVICE' || form.value.receiverType == 'TECH' ? '设备' : '模具'}编码`) |
|||
return; |
|||
} |
|||
} |
|||
|
|||
if (!form.value.factoryAreaNumber) { |
|||
proxy.$modal.showToast('请选择厂区') |
|||
return; |
|||
} |
|||
if (!form.value.receiverUserId) { |
|||
proxy.$modal.showToast('请选择维修人员') |
|||
return; |
|||
} |
|||
const paramsData = { |
|||
id: form.value && form.value.id ? form.value.id : '', |
|||
receiverType: form.value.receiverType, |
|||
deviceNumber: form.value.status == 0 ? form.value.deviceNumber : deviceNumber.value, |
|||
receiverUserId: form.value.receiverUserId, |
|||
factoryAreaNumber: form.value.factoryAreaNumber, |
|||
status: form.value.status, |
|||
} |
|||
proxy.$modal.confirm('是否转办维修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
repairOrderApi.transfer(paramsData).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('转办成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack(2) |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('转办失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
if (form.value.id) { |
|||
form.value = { |
|||
receiverType: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
receiverUserId: '', |
|||
status: 0, |
|||
statusTxt: '设备', |
|||
factoryAreaNumber: '', |
|||
factoryAreaName: '', |
|||
} |
|||
form.value.receiverType = deviceMoldType.value[0].value |
|||
form.value.receiverTypeTxt = deviceMoldType.value[0].label |
|||
selecUserList.value = [] |
|||
} else { |
|||
form.value = { |
|||
id: '', |
|||
receiverType: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
receiverUserId: '', |
|||
status: 0, |
|||
statusTxt: '设备', |
|||
factoryAreaNumber: '', |
|||
factoryAreaName: '', |
|||
} |
|||
form.value.receiverType = deviceMoldType.value[0].value |
|||
form.value.receiverTypeTxt = deviceMoldType.value[0].label |
|||
selecUserList.value = [] |
|||
} |
|||
} |
|||
// 扫描设备条码 |
|||
function chickRightButton(field) { |
|||
if (!form.value.receiverType) { |
|||
proxy.$modal.showToast('请先选择类型') |
|||
return; |
|||
} |
|||
uni.scanCode({ |
|||
success: function (res) { |
|||
form.value.deviceNumber = res.result |
|||
getDetailsByNumber() |
|||
} |
|||
}); |
|||
} |
|||
function blur() { |
|||
if (form.value.deviceNumber) { |
|||
getDetailsByNumber() |
|||
} else { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
} |
|||
} |
|||
// 根据设备/模具号查询信息 |
|||
function getDetailsByNumber() { |
|||
if (form.value.receiverType == 'DEVICE' || form.value.receiverType == 'TECH') { |
|||
deviceApi.getDeviceDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
type: form.value.receiverType |
|||
}).then(async (res) => { |
|||
if (!res.data) { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
selecUserList.value = [] |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
await getSelecUser() |
|||
}).catch(() => { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
selecUserList.value = [] |
|||
form.value.receiverUserId = '' |
|||
}) |
|||
} else if (form.value.receiverType == 'MOLD') { |
|||
moldApi.getMoldDetailsByNumber({ |
|||
number: form.value.deviceNumber, |
|||
}).then(async (res) => { |
|||
if (!res.data) { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
selecUserList.value = [] |
|||
form.value.receiverUserId = '' |
|||
return; |
|||
} |
|||
form.value.deviceName = res.data.name |
|||
form.value.factoryAreaName = res.data.factoryAreaName |
|||
form.value.factoryAreaNumber = res.data.factoryAreaNumber |
|||
await getSelecUser() |
|||
}).catch(() => { |
|||
form.value.deviceName = '' |
|||
form.value.factoryAreaName = '' |
|||
form.value.factoryAreaNumber = '' |
|||
selecUserList.value = [] |
|||
form.value.receiverUserId = '' |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form.value[field.value] = e[0].value |
|||
if (field.value == 'receiverType') { |
|||
form.value.deviceName = '' |
|||
form.value.deviceNumber = '' |
|||
form.value.receiverUserId = undefined |
|||
form.value.receiverTypeTxt = e[0].label |
|||
selecUserList.value = [] |
|||
form.value.receiverUserId = '' |
|||
getDeviceList() |
|||
} else if (field.value == 'factoryAreaNumber') { |
|||
form.value.factoryAreaName = e[0].label |
|||
form.value.receiverUserId = '' |
|||
|
|||
getSelecUser() |
|||
} else if (field.value == 'status') { |
|||
form.value.statusTxt = e[0].label |
|||
if (form.value.status == 0) { |
|||
deviceMoldType.value = deviceMoldType1.value.filter(item => item.value != type.value) |
|||
} else { |
|||
deviceMoldType.value = deviceMoldType1.value.filter(item => item.value == type.value) |
|||
} |
|||
console.log(deviceMoldType.value) |
|||
form.value.receiverType = deviceMoldType.value[0].value |
|||
form.value.receiverTypeTxt = deviceMoldType.value[0].label |
|||
selecUserList.value = [] |
|||
form.value.receiverUserId = '' |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
|
|||
// 获取设备/模具列表 |
|||
async function getDeviceList() { |
|||
if (form.value.receiverType == 'DEVICE' || form.value.receiverType == 'TECH') { |
|||
await deviceApi.deviceList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}) |
|||
} else if (form.value.receiverType == 'MOLD') { |
|||
await moldApi.moldList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 获取人员列表 |
|||
async function getSelecUser() { |
|||
let data = { |
|||
classType: form.value.receiverType, |
|||
factoryAreaNumber: form.value.factoryAreaNumber, |
|||
} |
|||
let arr = [] |
|||
if (form.value.maintenances) { |
|||
arr = form.value.maintenances.split(',') |
|||
} |
|||
await deptApi.getSelecUser(data).then(res => { |
|||
res.data.forEach(item => { |
|||
item.checked = false |
|||
arr.forEach(cur => { |
|||
if (item.id == cur) { |
|||
item.checked = true |
|||
} |
|||
}) |
|||
}) |
|||
selecUserList.value = res.data |
|||
}) |
|||
} |
|||
// 打开人员列表 |
|||
function openSelecUser(fieldName) { |
|||
field.value = fieldName |
|||
isShowSelecUser.value = true |
|||
} |
|||
function radioGroupChange(field, e, list) { |
|||
chooseUserInfo.value = e |
|||
} |
|||
// 多选选择框回显 |
|||
function selectFormatRadin(val, array) { |
|||
let str = array.filter(item => item.id == val)[0].name |
|||
return str |
|||
} |
|||
// 选择人员 |
|||
function chooseUser() { |
|||
form.value[field.value] = chooseUserInfo.value |
|||
isShowSelecUser.value = false |
|||
} |
|||
// 获取厂区列表 |
|||
function getFactoryAreaList() { |
|||
deptApi.getFactoryAreaList().then((res) => { |
|||
if (res.data && res.data.length > 0) { |
|||
res.data.map(item => { |
|||
item.value = item.id |
|||
item.label = item.name |
|||
}) |
|||
factoryAreaList.value = res.data |
|||
} else { |
|||
factoryAreaList.value = [] |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.id) form.value.id = option.id; |
|||
if (option.deviceNumber) deviceNumber.value = option.deviceNumber; |
|||
|
|||
deviceMoldType1.value = await dictApi.getDict('app_device_mold_type') |
|||
if (form.value.status == 0) { |
|||
deviceMoldType.value = deviceMoldType1.value.filter(item => item.value != type.value) |
|||
} else { |
|||
deviceMoldType.value = deviceMoldType1.value.filter(item => item.value == type.value) |
|||
} |
|||
form.value.receiverType = deviceMoldType.value[0].value |
|||
form.value.receiverTypeTxt = deviceMoldType.value[0].label |
|||
getFactoryAreaList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
|
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
image { |
|||
width: 160rpx; |
|||
height: 160rpx; |
|||
margin-right: 20rpx; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 60rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-radio-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,226 @@ |
|||
<template> |
|||
<!-- 设备 --> |
|||
<view class="work-container"> |
|||
<view class="cartNull" v-show="!token"> |
|||
还没有登录,请<navigator open-type="navigate" url="/pages/login">先登录</navigator> |
|||
</view> |
|||
<view class="" v-show='token'> |
|||
<Search :searchData='searchData' @search='search' @screen='screen' :isShowScreen='false' /> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key='index'> |
|||
<u-image :src="item.images" width='160' height="160"> |
|||
<template v-slot:error> |
|||
<view class="image-error"> |
|||
<u-icon name="photo" color="#c7c7c7" size="38"></u-icon> |
|||
<view style="font-size: 24rpx;">暂无图片</view> |
|||
</view> |
|||
</template> |
|||
</u-image> |
|||
<view class="text"> |
|||
<view class="title"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="dec1"> |
|||
备件编码:{{item.number}} |
|||
</view> |
|||
<view class="dec2"> |
|||
总库存:{{item.qty}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import { |
|||
getAccessToken |
|||
} from '@/utils/auth' |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import Search from '../../components/search/index.vue' |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
name: '' |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
const token = ref('') |
|||
const searchData = ref({ |
|||
placeholder:'请输入备件名称' |
|||
}) |
|||
// 搜索 |
|||
function search(keyWord) { |
|||
params.value.name = keyWord |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
function screen() { |
|||
proxy.$tab.navigateTo(`/pages/device/screen`) |
|||
} |
|||
function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
sparePartsApi.getSparePartsPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
console.log(res) |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
onShow(() => { |
|||
if (getAccessToken()) { |
|||
token.value = getAccessToken() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
} |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
// export default { |
|||
// components: { |
|||
// Search |
|||
// }, |
|||
// data() { |
|||
// return { |
|||
|
|||
// searchData: { |
|||
// placeholder: '请输入备件名称' |
|||
// }, |
|||
// params: { |
|||
// pageNo: 1, |
|||
// pageSize: 10, |
|||
// type: '', |
|||
// name: '' |
|||
// }, |
|||
// status: 'loadmore', //是否显示没有更多了 |
|||
// list: [], |
|||
// token: '' |
|||
// } |
|||
// }, |
|||
// methods: { |
|||
// // 搜索 |
|||
// // 搜索 |
|||
// search(keyWord) { |
|||
// this.params.name = keyWord |
|||
// this.params.pageNo = 1 |
|||
// this.list = [] |
|||
// this.status = 'loadmore' |
|||
// this.getList() |
|||
// }, |
|||
// // 筛选 |
|||
// screen() { |
|||
// this.$tab.navigateTo(`/pages/spareParts/screen`) |
|||
// }, |
|||
// // 获取设备保修列表 |
|||
// getList() { |
|||
// if (this.status == 'nomore') return; |
|||
// this.status = 'loading'; |
|||
// this.$modal.loading('加载中') |
|||
// sparePartsApi.getSparePartsPage(this.params).then((res) => { |
|||
// this.$modal.closeLoading() |
|||
// if (res.data.list.length > 0) { |
|||
// this.list = this.list.concat(res.data.list); |
|||
// this.params.pageNo++; |
|||
// this.status = 'loadmore' |
|||
// } else { |
|||
// this.status = 'nomore' |
|||
// } |
|||
// }).catch(()=>{}) |
|||
// }, |
|||
// }, |
|||
// onShow() { |
|||
// if (getAccessToken()) { |
|||
// this.token = getAccessToken() |
|||
// this.params.pageNo = 1 |
|||
// this.list = [] |
|||
// this.status = 'loadmore' |
|||
// this.getList() |
|||
// } |
|||
// }, |
|||
// onReachBottom() { |
|||
// this.getList() |
|||
// } |
|||
// } |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.work-container{ |
|||
min-height: 100vh; |
|||
background: #f5f5f5; |
|||
} |
|||
.list { |
|||
padding-bottom: 20rpx; |
|||
|
|||
.item { |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
padding: 30rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
.text { |
|||
margin-left: 20rpx; |
|||
|
|||
.title { |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.dec1 { |
|||
font-size: 28rpx; |
|||
margin-top: 16rpx; |
|||
color: #acacac; |
|||
} |
|||
|
|||
.dec2 { |
|||
font-size: 28rpx; |
|||
margin-top: 6rpx; |
|||
color: #acacac; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.image-error { |
|||
text-align: center; |
|||
} |
|||
|
|||
.cartNull { |
|||
text-align: center; |
|||
padding: 500rpx 40rpx 0; |
|||
font-size: 28rpx; |
|||
color: #888; |
|||
} |
|||
|
|||
.cartNull navigator { |
|||
color: #2979ff; |
|||
} |
|||
</style> |
@ -0,0 +1,495 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="申请主题" prop="name" required> |
|||
<u-input v-model="form.name" placeholder="请输入申请主题" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="list"> |
|||
<view class="title"> |
|||
<span>*</span>申请备件 |
|||
</view> |
|||
<view class="item " v-for="(item,index) in form.subList" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="24"> |
|||
<view class="dec" v-if="item.type"> |
|||
类型:{{`${item.type=='DEVICE'?'设备' :item.type=='MOLD'?'模具' : ''}`}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec" v-if="item.deviceName"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}:{{item.deviceName}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
是否以旧换新:{{item.isRadeIn=='TRUE'?'是' :'否'}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
库存:{{item.currentQty}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
数量:{{item.qty}} |
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
<u-icon name="minus-circle" color="#aaaaaa" size="60" @click="delSpareParts(index)"></u-icon> |
|||
</view> |
|||
<view class="add-btn"> |
|||
<u-button type="primary" @click="open"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加备件</u-button> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 添加备件 --> |
|||
<u-popup v-model="isPopupShow" mode="center" border-radius="14"> |
|||
<view class="popup-title">添加备件</view> |
|||
<view class="popup"> |
|||
<u-form :model="form1" ref="form1Ref" label-width="200rpx"> |
|||
<u-form-item :label="`备件`" prop="number" required> |
|||
<view class="select" @click="openSingleColumn('itemNumber',form1.itemNumber,sparePartsList)"> |
|||
<view class="input" v-if='form1.itemNumber'> |
|||
{{form1.name}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择备件 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="类型" prop="type"> |
|||
<view class="select" @click="openSingleColumn('type',form1.type,deviceMoldType)"> |
|||
<view class="input" v-if='form1.type'> |
|||
{{form1.typeName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择类型`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${form1.type=='DEVICE'?'设备' : '模具'}`" prop="deviceNumber"> |
|||
<view class="select" @click="openSingleColumn('deviceNumber',form1.deviceNumber,deviceList)"> |
|||
<view class="input" v-if='form1.deviceNumber'> |
|||
{{form1.deviceName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择${form1.type=='DEVICE'?'设备' : '模具'}`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="是否以旧换新" prop="isRadeIn" required class="disabled"> |
|||
<u-radio-group v-model="form1.isRadeIn" :key="updataKey" disabled> |
|||
<u-radio :name="'TRUE'">是</u-radio> |
|||
<u-radio :name="'FALSE'">否</u-radio> |
|||
</u-radio-group> |
|||
</u-form-item> |
|||
<u-form-item label="库存" prop="currentQty" required class="disabled"> |
|||
<u-input v-model="form1.currentQty" type="number" disabled placeholder="请输入库存" /> |
|||
</u-form-item> |
|||
<u-form-item label="数量" prop="qty" required> |
|||
<u-input v-model="form1.qty" type="number" placeholder="请输入数量" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isPopupShow = false">取消</view> |
|||
<view class="sure" @click="addSpare">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApi from "@/api/sparePartsApplication.js" |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import * as deviceApi from "@/api/device.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as moldApi from "@/api/mold.js" |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
// 备件弹窗 |
|||
const isPopupShow = ref(false) |
|||
const sparePartsList = ref([]) |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const deviceList = ref([])//设备列表 |
|||
const choosesingleColumnItem = ref([]) |
|||
const form = ref({ |
|||
name: '', |
|||
subList: [] |
|||
}) |
|||
const form1 = ref({ |
|||
itemNumber: undefined, |
|||
type: '', |
|||
deviceNumber: undefined, |
|||
isRadeIn: '', |
|||
currentQty: '', |
|||
qty: '' |
|||
}) |
|||
const deviceMoldType = ref([])//设备列表 |
|||
const updataKey = ref(0) |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.name) { |
|||
proxy.$modal.showToast('请输入主题') |
|||
return; |
|||
} |
|||
if (form.value.subList.length === 0) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
proxy.$modal.confirm('是否添加备件申请').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
sparePartsApplicationApi.sparePartsApplicationCreate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value = { |
|||
name: '', |
|||
subList: [] |
|||
} |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form1.value[field.value] = e[0].value |
|||
if (field.value == 'itemNumber') { |
|||
form1.value.name = e[0].label |
|||
choosesingleColumnItem.value = singleColumnList.value.filter(item => item.number == e[0].value) |
|||
form1.value.isRadeIn = choosesingleColumnItem.value[0].isRadeIn |
|||
form1.value.currentQty = choosesingleColumnItem.value[0].qty |
|||
updataKey.value++ |
|||
|
|||
} |
|||
if (field.value == 'type') { |
|||
form1.value.typeName = e[0].label |
|||
form1.value.deviceNumber = '' |
|||
form1.value.deviceName = '' |
|||
} |
|||
if (field.value == 'deviceNumber') { |
|||
form1.value.deviceName = e[0].label |
|||
} |
|||
|
|||
getApplyDeviceList() |
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取备件列表 |
|||
async function getApplySparePartsList() { |
|||
await sparePartsApi.getApplySparePartsList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
sparePartsList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 获取设备列表 |
|||
async function getApplyDeviceList() { |
|||
if (form1.value.type == 'DEVICE') { |
|||
await deviceApi.getApplyDeviceList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}).catch(() => { }) |
|||
} else if (form1.value.type == 'MOLD') { |
|||
moldApi.getApplyMoldList().then((res) => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
deviceList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
} |
|||
// 打开弹窗 |
|||
function open() { |
|||
form1.value = { |
|||
itemNumber: undefined, |
|||
type: '', |
|||
deviceNumber: undefined, |
|||
isRadeIn: '', |
|||
currentQty: "", |
|||
qty: '', |
|||
} |
|||
isPopupShow.value = true |
|||
} |
|||
// 添加配件 |
|||
function addSpare() { |
|||
if (!form1.value.itemNumber) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
// if (!this.form1.deviceNumber) { |
|||
// this.$modal.showToast('请选择设备') |
|||
// return; |
|||
// } |
|||
if (!form1.value.qty || form1.value.qty == 0) { |
|||
proxy.$modal.showToast('请输入数量') |
|||
return; |
|||
} |
|||
if (form1.value.qty > form1.value.currentQty) { |
|||
proxy.$modal.showToast('数量不可以大于库存') |
|||
return; |
|||
} |
|||
if (form.valuesubList && form.value.subList.length > 0) { |
|||
let arr = form.value.subList.filter(item => item.itemNumber == form1.value.itemNumber) |
|||
if (arr && arr.length > 0) { |
|||
proxy.$modal.showToast('该备件已添加') |
|||
return; |
|||
} |
|||
} |
|||
|
|||
form.value.subList.push(form1.value) |
|||
isPopupShow.value = false |
|||
} |
|||
// 删除备件 |
|||
function delSpareParts(index) { |
|||
form.value.subList.splice(index, 1) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type)type.value = option.type; |
|||
if (option.number) form.value.maintenanceNumber = option.number; |
|||
if (option.data && JSON.parse(decodeURIComponent(option.data)) && JSON.parse(decodeURIComponent(option |
|||
.data)).id) { |
|||
form.value = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value.subList = form.value.subList |
|||
}; |
|||
deviceMoldType.value = await dictApi.getDict('device_mold_type') |
|||
await getApplySparePartsList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.title { |
|||
padding: 32rpx 0rpx; |
|||
position: relative; |
|||
|
|||
span { |
|||
position: absolute; |
|||
left: -16rpx; |
|||
color: #fa3534; |
|||
top: 19px; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 0rpx 30rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 0rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-checkbox-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,307 @@ |
|||
<template> |
|||
<!-- 详情 --> |
|||
<view class="detail-container"> |
|||
<view class="info"> |
|||
<view class="title"> |
|||
<view>备件申领工单</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view class="dec-item"> |
|||
<view>申请主题:</view> |
|||
<view>{{data.name}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>申请单号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>申请备件:</view> |
|||
</view> |
|||
<view class="items" v-for="(cur,key) in data.subList" :key="key" style="margin-bottom: 20rpx;"> |
|||
<view class="items-name"> |
|||
备件名称:{{cur.itemName}} |
|||
</view> |
|||
<view class="items-dec" v-if="cur.type"> |
|||
类型:{{cur.type == 'type'?'设备' :'模具'}} |
|||
</view> |
|||
<view class="items-dec" v-if="cur.name"> |
|||
{{cur.type == 'type'?'设备' :'模具'}}名称:{{cur.name}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
是否以旧换新:{{cur.isRadeIn == 'TRUE'?'是' :'否'}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
数量:{{cur.qty}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer" v-if="from == 3"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reject">驳回</button> |
|||
<button class="sure" @click="agree" :loading='loading' :disabled='loading'>通过</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApi from "@/api/sparePartsApplication.js" |
|||
import * as sparePartsApplicationApproveApi from "@/api/sparePartsApplicationApprove.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const number = ref('') |
|||
const data = ref({}) |
|||
const loading = ref(false) |
|||
const from = ref()//1从我的进入3从审核进入 |
|||
const type = ref() |
|||
function getSparePartsApplicationDetail() { |
|||
sparePartsApplicationApi.sparePartsApplicationDetail(number.value).then((res) => { |
|||
data.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 触发提交表单 |
|||
function agree() { |
|||
proxy.$modal.confirm('确定通过申请吗').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
sparePartsApplicationApproveApi.sparePartsApplicationAgree(data.value.id).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('审核成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('审核失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
|
|||
} |
|||
// 驳回 |
|||
function reject(item) { |
|||
proxy.$modal.confirm('确定驳回申请吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
sparePartsApplicationApproveApi.sparePartsApplicationReject(item.id).then(async (res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('已驳回') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('审核失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
|
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.from) from.value = option.from; |
|||
if (option.number) { |
|||
number.value = option.number |
|||
} |
|||
}) |
|||
onShow(() => { |
|||
getSparePartsApplicationDetail() |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.detail-container { |
|||
min-height: 100vh; |
|||
background: white; |
|||
} |
|||
|
|||
.line { |
|||
background: #f5f5f5; |
|||
height: 20rpx; |
|||
} |
|||
|
|||
.info { |
|||
background: white; |
|||
} |
|||
|
|||
|
|||
.tab { |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
} |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
flex: 1; |
|||
border-left: 10rpx solid #409eff; |
|||
padding-left: 20rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding: 30rpx; |
|||
|
|||
.dec-item { |
|||
padding-bottom: 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 160rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec2 { |
|||
padding: 10rpx 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 180rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
.items { |
|||
border-radius: 12rpx; |
|||
background: #F5F5F5; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.items-name { |
|||
padding: 20rpx; |
|||
border-bottom: 1px solid #dedede; |
|||
} |
|||
|
|||
.items-dec { |
|||
padding: 0px 20rpx; |
|||
margin-top: 20rpx; |
|||
} |
|||
} |
|||
|
|||
|
|||
.list { |
|||
padding: 20rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
border-radius: 12rpx; |
|||
border: 1px solid #dedede; |
|||
border-radius: 12rpx; |
|||
|
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
display: flex; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
flex: 1; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 0rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,183 @@ |
|||
<template> |
|||
<!-- 备件领用申请 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="备件领用申请"> |
|||
<template v-slot:right> |
|||
<u-icon name="plus" color="#fff" size="36" style="padding-right: 30rpx;" @click="addForm"></u-icon> |
|||
</template> |
|||
</u-navbar> |
|||
<!-- <Search @search='search' @screen='screen' /> --> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" @click="openDetail(item)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
申请单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
申 请 人:<span>{{item.applyName}}</span> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag text="待审批" v-if="item.status==0" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="审批通过" v-else-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#2EC7C9' |
|||
border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="审批驳回" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#e01f54' |
|||
border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="出库中" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#005eaa' |
|||
border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="完成" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#2ba471' |
|||
border-color='#2ba471' type="info" shape='circle' /> |
|||
<u-tag text="撤单" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#d7d7d7' |
|||
border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
</view> |
|||
<view class="button"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" |
|||
v-if="item.status==0" @click="cancle(item)">撤回</u-button> |
|||
</view> |
|||
|
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApi from "@/api/sparePartsApplication.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function openDetail(item, index) { |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/detail?number=${item.number}`) |
|||
} |
|||
function addForm(item) { |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/addForm`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await sparePartsApplicationApi.sparePartsApplicationPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
// 撤销 |
|||
function cancle(item) { |
|||
proxy.$modal.confirm('确定撤回申请吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
sparePartsApplicationApi.sparePartsApplicationCancle(item.id).then(async (res) => { |
|||
proxy.$modal.closeLoading() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
await getList() |
|||
proxy.$modal.showToast('撤回成功') |
|||
}).catch(()=>{}) |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
position: relative; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,170 @@ |
|||
<template> |
|||
<!-- 备件领用申请 --> |
|||
<view class="container"> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" @click="openDetail(item)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
申请单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
申 请 人:<span>{{item.applyName}}</span> |
|||
</view> |
|||
<view class="dec" v-if="item.status!=0"> |
|||
审批时间:<span>{{`${$time.formatDate(item.approveTime)}`}}</span> |
|||
</view> |
|||
<view class="dec" v-if="item.status!=0"> |
|||
审 批 人:<span>{{item.approveName}}</span> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag text="待审批" v-if="item.status==0" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="审批通过" v-else-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#2EC7C9' |
|||
border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="审批驳回" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#e01f54' |
|||
border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="出库中" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#005eaa' |
|||
border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="完成" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#2ba471' |
|||
border-color='#2ba471' type="info" shape='circle' /> |
|||
<u-tag text="撤单" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#d7d7d7' |
|||
border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
</view> |
|||
|
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
|
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApi from "@/api/sparePartsApplication.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag:null |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function openDetail(item, index) { |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/detail?number=${item.number}`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await sparePartsApplicationApi.sparePartsApplicationPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.flag) params.value.flag = option.flag; |
|||
if(params.value.flag == 2){ |
|||
uni.setNavigationBarTitle({ |
|||
title:'领用申请审批' |
|||
}) |
|||
} |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
position: relative; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,199 @@ |
|||
<template> |
|||
<!-- 备件领用申请审批 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="领用申请审批"> |
|||
</u-navbar> |
|||
<!-- <Search @search='search' @screen='screen' /> --> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" @click="openDetail(item)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
申请单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
申 请 人:<span>{{item.applyName}}</span> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag text="待审批" v-if="item.status==0" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="审批通过" v-else-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#2EC7C9' |
|||
border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="审批驳回" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#e01f54' |
|||
border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="出库中" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#005eaa' |
|||
border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="完成" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#2ba471' |
|||
border-color='#2ba471' type="info" shape='circle' /> |
|||
<u-tag text="撤单" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#d7d7d7' |
|||
border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
</view> |
|||
<view class="button"> |
|||
<u-button shape="circle" size="mini" style="min-width: 120rpx;" |
|||
v-if="item.status==0" @click="reject(item)">驳回</u-button> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;margin-left: 20rpx;" |
|||
v-if="item.status==0" @click="agree(item)">通过</u-button> |
|||
</view> |
|||
|
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApproveApi from "@/api/sparePartsApplicationApprove.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
const from = ref('') |
|||
|
|||
function openDetail(item, index) { |
|||
console.log(from.value) |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/detail?number=${item.number}&from=${from.value}`) |
|||
} |
|||
function addForm(item) { |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/addForm`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await sparePartsApplicationApproveApi.sparePartsApplicationApprovePage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
// 通过 |
|||
function agree(item) { |
|||
proxy.$modal.confirm('确定通过申请吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
sparePartsApplicationApproveApi.sparePartsApplicationAgree(item.id).then(async (res) => { |
|||
proxy.$modal.closeLoading() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
await getList() |
|||
proxy.$modal.showToast('审核成功') |
|||
}) |
|||
|
|||
}).catch(()=>{}) |
|||
} |
|||
// 驳回 |
|||
function reject(item) { |
|||
proxy.$modal.confirm('确定驳回申请吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
sparePartsApplicationApproveApi.sparePartsApplicationReject(item.id).then(async (res) => { |
|||
proxy.$modal.closeLoading() |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
await getList() |
|||
proxy.$modal.showToast('已驳回') |
|||
}).catch(()=>{}) |
|||
|
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
if (option.from)from.value = option.from; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
position: relative; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,170 @@ |
|||
<template> |
|||
<!-- 备件领用申请 --> |
|||
<view class="container"> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" @click="openDetail(item)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
申请单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
申 请 人:<span>{{item.applyName}}</span> |
|||
</view> |
|||
<view class="dec" v-if="item.status!=0"> |
|||
审批时间:<span>{{`${$time.formatDate(item.approveTime)}`}}</span> |
|||
</view> |
|||
<view class="dec" v-if="item.status!=0"> |
|||
审 批 人:<span>{{item.approveName}}</span> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag text="待审批" v-if="item.status==0" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="审批通过" v-else-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#2EC7C9' |
|||
border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="审批驳回" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#e01f54' |
|||
border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="出库中" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#005eaa' |
|||
border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="完成" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#2ba471' |
|||
border-color='#2ba471' type="info" shape='circle' /> |
|||
<u-tag text="撤单" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#d7d7d7' |
|||
border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
</view> |
|||
|
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
|
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApplicationApproveApi from "@/api/sparePartsApplicationApprove.js" |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag:'' |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function openDetail(item) { |
|||
proxy.$tab.navigateTo(`/pages/sparePartsApplication/detail?number=${item.number}&from=1`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await sparePartsApplicationApproveApi.sparePartsApplicationApprovePage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.flag) params.value.flag = option.flag; |
|||
if(params.value.flag == 2){ |
|||
uni.setNavigationBarTitle({ |
|||
title:'领用申请审批' |
|||
}) |
|||
} |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
position: relative; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,494 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<!-- <u-form :model="form" ref="form1" label-width="160rpx"> |
|||
<u-form-item label="申请主题" prop="name" required> |
|||
<u-input v-model="form.name" placeholder="请输入申请主题" /> |
|||
</u-form-item> |
|||
</u-form> --> |
|||
<view class="list"> |
|||
<view class="title"> |
|||
<span>*</span>申请备件 |
|||
</view> |
|||
<view class="item " v-for="(item,index) in form.itemNumbers" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
库位:{{item.locationNumber}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
数量:{{item.qty}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
维修结果:{{item.result == 'YES'?'完成':'未完成'}} |
|||
</view> |
|||
</u-col> |
|||
<u-col :span="24"> |
|||
<view class="dec"> |
|||
维修原因:{{item.reasons}} |
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
<u-icon name="minus-circle" color="#aaaaaa" size="60" @click="delSpareParts(index)"></u-icon> |
|||
</view> |
|||
<view class="add-btn"> |
|||
<u-button type="primary" @click="open"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加备件</u-button> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 添加备件 --> |
|||
<u-popup v-model="isPopupShow" mode="center" border-radius="14"> |
|||
<view class="popup-title">添加备件</view> |
|||
<view class="popup"> |
|||
<u-form :model="form1" ref="formRef" label-width="200rpx"> |
|||
<u-form-item :label="`备件`" prop="itemNumber" required> |
|||
<view class="select" @click="openSingleColumn('itemNumber',form1.itemNumber,sparePartsList)"> |
|||
<view class="input" v-if='form1.itemNumber'> |
|||
{{form1.name}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择备件 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="库位" prop="locationNumber" required v-if="isShow"> |
|||
<u-input v-model="form1.locationNumber" placeholder="请输入库位" @blur="blur()" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="数量" prop="qty" required> |
|||
<u-input v-model="form1.qty" type="number" placeholder="请输入数量" /> |
|||
</u-form-item> |
|||
<u-form-item label="维修结果" prop="reasons" required> |
|||
<u-radio-group v-model="form1.result"> |
|||
<u-radio :name="item.value" v-for="(item,index) in result" |
|||
:key="index">{{item.label}}</u-radio> |
|||
</u-radio-group> |
|||
</u-form-item> |
|||
<u-form-item label="维修原因" prop="reasons" required> |
|||
<u-input v-model="form1.reasons" placeholder="请输入维修原因" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isPopupShow = false">取消</view> |
|||
<view class="sure" @click="addSpare">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import * as sparePartsServiceWorkOrderListApi from "@/api/sparePartsServiceWorkOrderList.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import * as locationApi from "@/api/location.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
// 备件弹窗 |
|||
const isPopupShow = ref(false) |
|||
const sparePartsList = ref([]) |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
|
|||
const form = ref({ |
|||
itemNumbers: [] |
|||
}) |
|||
const form1 = ref({ |
|||
itemNumber: "", |
|||
qty: '', |
|||
result: 'YES', |
|||
reasons: '', |
|||
locationNumber: '', |
|||
areaNumber: '' |
|||
}) |
|||
const result = ref([]) |
|||
const isShow = ref(false) |
|||
|
|||
const choosesingleColumnItem = ref() |
|||
const isInAccount = ref() |
|||
const itemNumber = ref() |
|||
const msg = ref('') |
|||
|
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (form.value.itemNumbers == 0) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
proxy.$modal.confirm('是否添加备件维修工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
sparePartsServiceWorkOrderListApi.sparePartsServiceWorkOrderListCreate(form.value).then(( |
|||
res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value = { |
|||
itemNumbers: [] |
|||
} |
|||
} |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
if (fieldName == 'deviceNumber' && form.value.id) return; |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form1.value[field.value] = e[0].value |
|||
if (field.value == 'itemNumber') { |
|||
choosesingleColumnItem.value = singleColumnList.value.filter(item => item.number == e[0].value) |
|||
form1.value.name = e[0].label |
|||
form1.value.locationNumber = choosesingleColumnItem.value[0].locationNumber |
|||
form1.value.areaNumber = choosesingleColumnItem.value[0].areaNumber |
|||
if (!choosesingleColumnItem.value[0].locationNumber) { |
|||
isShow.value = true |
|||
} else { |
|||
isShow.value = false |
|||
itemNumber.value = '' |
|||
} |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取备件列表 |
|||
async function getServiceSparePartsList() { |
|||
await sparePartsApi.getServiceSparePartsList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
sparePartsList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 扫描设备条码 |
|||
function chickRightButton(field) { |
|||
uni.scanCode({ |
|||
success: function (res) { |
|||
form1.value.locationNumber = res.result |
|||
getLocation() |
|||
} |
|||
}); |
|||
} |
|||
function getLocation() { |
|||
locationApi.getLocation(form1.value.locationNumber).then(res => { |
|||
if (!res.data) { |
|||
msg.value = res.msg ? res.msg : '找不到该库位' |
|||
proxy.$modal.showToast(msg.value) |
|||
|
|||
form1.value.areaNumber ='' |
|||
isInAccount.value = '' |
|||
itemNumber.value = '' |
|||
return; |
|||
} |
|||
msg.value = '' |
|||
form1.value.areaNumber = res.data.areaNumber; |
|||
isInAccount.value = res.data.isInAccount |
|||
itemNumber.value = res.data.itemNumber |
|||
}).catch(() => { }) |
|||
} |
|||
function blur() { |
|||
if (form1.value.locationNumber) { |
|||
getLocation() |
|||
} |
|||
} |
|||
// 打开弹窗 |
|||
function open() { |
|||
form1.value = { |
|||
itemNumber: "", |
|||
qty: '', |
|||
result: 'YES', |
|||
reasons: '', |
|||
locationNumber: '', |
|||
areaNumber: '' |
|||
} |
|||
isPopupShow.value = true |
|||
} |
|||
// 添加配件 |
|||
function addSpare() { |
|||
// 校验 |
|||
if (!form1.value.itemNumber) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
if (!form1.value.locationNumber) { |
|||
proxy.$modal.showToast('请扫描库位') |
|||
return; |
|||
} |
|||
if(msg.value){ |
|||
proxy.$modal.showToast(msg.value) |
|||
return; |
|||
} |
|||
if (isInAccount.value == 'TRUE') { |
|||
proxy.$modal.showToast('该库位属于帐内库,请选择帐外库') |
|||
return; |
|||
} |
|||
if (itemNumber.value) { |
|||
proxy.$modal.showToast('该库位已绑定过备件') |
|||
return; |
|||
} |
|||
if (!form1.value.qty) { |
|||
proxy.$modal.showToast(`请输入数量`) |
|||
return; |
|||
} |
|||
if (!form1.value.result) { |
|||
proxy.$modal.showToast('请选择维修结果') |
|||
return; |
|||
} |
|||
if (!form1.value.reasons) { |
|||
proxy.$modal.showToast('请输入维修原因') |
|||
return; |
|||
} |
|||
if (form.value.itemNumbers && form.value.itemNumbers.length > 0) { |
|||
let arr = form.value.itemNumbers.filter(item => item.itemNumber == form1.value.itemNumber) |
|||
if (arr && arr.length > 0) { |
|||
proxy.$modal.showToast('该备件已添加') |
|||
return; |
|||
} |
|||
} |
|||
if (form.value.itemNumbers && form.value.itemNumbers.length > 0) { |
|||
let arr1 = form.value.itemNumbers.filter(item => item.locationNumber == form1.value.locationNumber) |
|||
if (arr1 && arr1.length > 0) { |
|||
proxy.$modal.showToast('该库位已经绑定备件') |
|||
return; |
|||
} |
|||
} |
|||
form.value.itemNumbers.push(form1.value) |
|||
isPopupShow.value = false |
|||
} |
|||
// 删除备件 |
|||
function delSpareParts(index) { |
|||
form.value.itemNumbers.splice(index, 1) |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
result.value = await dictApi.getDict('result') |
|||
await getServiceSparePartsList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.title { |
|||
padding: 32rpx 0rpx; |
|||
position: relative; |
|||
|
|||
span { |
|||
position: absolute; |
|||
left: -16rpx; |
|||
color: #fa3534; |
|||
top: 19px; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 0rpx 30rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 0rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-checkbox-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,176 @@ |
|||
<template> |
|||
<!-- 备件领用申请 --> |
|||
<view class="container"> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.itemName}} |
|||
</view> |
|||
<view class="time"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view>申请单号:</view><view>{{item.number}}</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view>备件单号:</view><view>{{item.itemNumber}}</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view>数量:</view><view>{{item.qty}}</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view>维修结果:</view><view>{{item.result == 'YES'?'完成':'未完成'}}</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view>维修原因:</view><view>{{item.reasons}}</view> |
|||
</view> |
|||
<!-- <view class="bottom"> |
|||
<view class="status"> |
|||
<u-tag text="待审批" v-if="item.status==0" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="审批通过" v-else-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#2EC7C9' |
|||
border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="审批驳回" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#e01f54' |
|||
border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="出库中" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#005eaa' |
|||
border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="完成" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#2ba471' |
|||
border-color='#2ba471' type="info" shape='circle' /> |
|||
<u-tag text="撤单" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#d7d7d7' |
|||
border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
</view> |
|||
<view class="button"> |
|||
<u-button shape="circle" type="primary" size="mini" style="min-width: 120rpx;" |
|||
v-if="item.status==0" @click="cancle(item)">撤回</u-button> |
|||
</view> |
|||
|
|||
</view> --> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as sparePartsServiceWorkOrderListApi from "@/api/sparePartsServiceWorkOrderList.js" |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag:null |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await sparePartsServiceWorkOrderListApi.sparePartsServiceWorkOrderListPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
position: relative; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
view { |
|||
&:nth-child(1){ |
|||
width: 160rpx;; |
|||
} |
|||
&:nth-child(2){ |
|||
color: #999999; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
height: 90rpx; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,358 @@ |
|||
<template> |
|||
<!-- 添加设备报修 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="点检描述" prop="describes" required> |
|||
<u-input v-model="form.describes" placeholder="请输入点检描述" /> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'?'设备' : '模具'}编码`" prop="deviceNumber" required> |
|||
<u-input v-model="form.deviceNumber" |
|||
:placeholder="`请输入${type=='DEVICE'?'设备' : '模具'}编码`" @blur="blur" @confirm='blur()'/> |
|||
<view class="right-button" @click="chickRightButton"> |
|||
扫描 |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item :label="`${type=='DEVICE'?'设备' : '模具'}名称`" prop="deviceName" required class="disabled"> |
|||
<u-input v-model="form.deviceName" :placeholder="`请输入${type=='DEVICE'?'设备' : '模具'}名称`" disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="点检人" prop="name" required class="disabled"> |
|||
<u-input v-model=" store.name" placeholder="请输入点检人" disabled /> |
|||
</u-form-item> |
|||
<u-form-item label="班次" prop="classes" required> |
|||
<view class="select" @click="openSingleColumn('classes',form.classes,maintenanceShift)"> |
|||
<view class="input" v-if='form.classes'> |
|||
{{form.classesName}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择班次`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
</u-form> |
|||
<view class="list"> |
|||
<!-- <view class="title"> |
|||
<span></span>备件 |
|||
</view> --> |
|||
<view class="item " v-for="(item,index) in subList" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="12"> |
|||
<view class="dec"> |
|||
<view class=""> |
|||
设备部位名称: |
|||
</view> |
|||
<view>{{item.equipmentParts}}</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view style="margin-right: 20rpx;">是否符合:</view><u-switch v-model="item.isConform1"></u-switch> |
|||
|
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
|
|||
import * as deviceApi from "@/api/device.js" |
|||
import * as spotCheckOrderApi from "@/api/spotCheckOrder.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
|
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const form = ref({ |
|||
describes: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
maintenances:'', |
|||
classes: '', |
|||
classesName:'' |
|||
}) |
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const maintenanceShift = ref([]) |
|||
const subList = ref([]) |
|||
// 扫描设备条码 |
|||
function chickRightButton(field) { |
|||
uni.scanCode({ |
|||
success: function(res) { |
|||
form.value.deviceNumber = res.result |
|||
getDetailsByNumber() |
|||
getSubList() |
|||
} |
|||
}); |
|||
} |
|||
function blur() { |
|||
if (form.value.deviceNumber) { |
|||
getDetailsByNumber() |
|||
getSubList() |
|||
} |
|||
} |
|||
// 根据设备/模具号查询信息 |
|||
function getDetailsByNumber() { |
|||
const data = { |
|||
number:form.value.deviceNumber, |
|||
flag:2 |
|||
} |
|||
deviceApi.getDeviceDetailsByNumber(data).then((res) => { |
|||
if (res.data) { |
|||
form.value.deviceName = res.data.name |
|||
} else { |
|||
proxy.$modal.showToast(`找不到该${type.value=='DEVICE'?'设备' : '模具'}`) |
|||
} |
|||
}).catch(()=>{}) |
|||
} |
|||
// 根据设备获取二级列表 |
|||
function getSubList() { |
|||
const data = { |
|||
number: form.value.deviceNumber |
|||
} |
|||
deviceApi.getSubList(data).then((res) => { |
|||
if (res.data) { |
|||
subList.value = res.data |
|||
} else { |
|||
proxy.$modal.showToast(`找不到该${type.value=='DEVICE'?'设备' : '模具'}`) |
|||
} |
|||
}).catch(()=>{}) |
|||
} |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (!form.value.describes) { |
|||
proxy.$modal.showToast('请输入点检描述') |
|||
return; |
|||
} |
|||
if (!form.value.deviceNumber) { |
|||
proxy.$modal.showToast(`请输入${type.value=='DEVICE'?'设备' : '模具'}编码`) |
|||
return; |
|||
} |
|||
if (!form.value.classes) { |
|||
proxy.$modal.showToast('请选择班次') |
|||
return; |
|||
} |
|||
if (subList.value.length==0) { |
|||
proxy.$modal.showToast('该设备无检修项目') |
|||
return; |
|||
} |
|||
subList.value.forEach(item=>{ |
|||
item.isConform = !item.isConform1 ? 'FALSE' : 'TRUE' |
|||
}) |
|||
const data = { |
|||
describes:form.value.describes, |
|||
deviceNumber:form.value.deviceNumber, |
|||
maintenances: form.value.maintenances, |
|||
classes:form.value.classes, |
|||
subList:subList.value, |
|||
type: type.value |
|||
} |
|||
proxy.$modal.confirm('是否添加点检工单').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
spotCheckOrderApi.spotCheckOrderCreate(data).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value = { |
|||
describes: "", |
|||
deviceNumber: '', |
|||
deviceName: '', |
|||
maintenances:'', |
|||
classes: '' |
|||
} |
|||
} |
|||
|
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list) { |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
form.value[field.value] = e[0].value |
|||
if(field.value == 'classes'){ |
|||
form.value.classesName = e[0].label |
|||
} |
|||
singleColumnShow.value = false |
|||
} |
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
maintenanceShift.value = await dictApi.getDict('maintenance_shift') |
|||
form.value.maintenances = uni.getStorageSync('user').nickname |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
|
|||
.u-form-item { |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
|
|||
.disabled { |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.list { |
|||
padding: 30rpx 30rpx; |
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
</style> |
@ -0,0 +1,217 @@ |
|||
<template> |
|||
<!-- 点检工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="点检工单"> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" > |
|||
<view class=""> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
|||
</view> |
|||
<view class="dec"> |
|||
点检单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
班次:<span>{{item.classesName}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as spotCheckOrderApi from "@/api/spotCheckOrder.js" |
|||
import { useCountStore } from '@/store' |
|||
|
|||
const { proxy } = getCurrentInstance() |
|||
// 获取自定义的store |
|||
const store = useCountStore() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag:1 |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await spotCheckOrderApi.spotCheckOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,648 @@ |
|||
<template> |
|||
<!-- 添加维修工单 --> |
|||
<view class="add-form-container"> |
|||
<u-form :model="form" ref="formRef" label-width="160rpx"> |
|||
<u-form-item label="保养内容" prop="contents" required class="disabled"> |
|||
<u-input v-model="form.contents" placeholder="请输入保养内容" maxlength="50" disabled/> |
|||
</u-form-item> |
|||
<!-- <u-form-item label="保养部位" prop="equipmentParts" required> |
|||
<u-input v-model="form.equipmentParts" placeholder="请输入保养部位" maxlength="50" disabled/> |
|||
</u-form-item> --> |
|||
<u-form-item label="预估人数" prop="peoples" class="disabled"> |
|||
<u-input v-model="form.peoples" type="number" placeholder="请输入预估人数" maxlength="50" disabled/> |
|||
</u-form-item> |
|||
<u-form-item label="预估分钟" prop="estimatedMinutes" class="disabled"> |
|||
<u-input v-model="form.estimatedMinutes" type="number" placeholder="请输入预估分钟" maxlength="50" disabled/> |
|||
</u-form-item> |
|||
<u-form-item label="实际分钟" prop="actualMinutes" required> |
|||
<u-input v-model="form.actualMinutes" type="number" placeholder="请输入实际分钟" maxlength="50"/> |
|||
</u-form-item> |
|||
<u-form-item label="责任人" prop="chargePeoples" required> |
|||
<view class="select" @click="openSelecUser"> |
|||
<view class="input" v-if='form.chargePeoples'> |
|||
{{selectFormatCheck(form.chargePeoples,selecUserList)}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择维修人员 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="完成情况" prop="status" required> |
|||
<view class="select" @click="openSingleColumn('status',form.status,jxDetailsStatus,'form')"> |
|||
<view class="input" v-if='form.status'> |
|||
{{form.statusTxt}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择完成情况`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28" v-if="!form.id"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="完成时间" prop="completionTime" required v-if='form.status === 0||form.status === "0"'> |
|||
<view class="select" @click="openDatetime('completionTime',formatDate,params,formatValue)"> |
|||
<view class="input" v-if='formatDate'> |
|||
{{formatDate}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
{{`请选择完成时间`}} |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="未完成原因" prop="uncompleted" required v-if='form.status === 1||form.status === "1"'> |
|||
<u-input type='textarea' v-model="form.uncompleted" placeholder="请输入未完成原因" maxlength="200" /> |
|||
</u-form-item> |
|||
<u-form-item label="工程师确认" prop="engineer"> |
|||
<u-input v-model="form.engineer" placeholder="请输入工程师确认" maxlength="50"/> |
|||
</u-form-item> |
|||
</u-form> |
|||
|
|||
<view class="list"> |
|||
<view class="title"> |
|||
<span></span>备件 |
|||
</view> |
|||
<view class="item " v-for="(item,index) in form.itemNumbers" :key="index"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.name}} |
|||
</view> |
|||
</view> |
|||
<u-row gutter="16"> |
|||
<u-col :span="12"> |
|||
<view class="dec"> |
|||
<view class=""> |
|||
数量:{{item.qty}} |
|||
</view> |
|||
</view> |
|||
</u-col> |
|||
</u-row> |
|||
</view> |
|||
<u-icon name="minus-circle" color="#aaaaaa" size="60" @click="delSpareParts(index)"></u-icon> |
|||
</view> |
|||
<view class="add-btn"> |
|||
<u-button type="primary" @click="open"><u-icon name="plus-circle" color="#ffffff" |
|||
size="36"></u-icon>添加备件</u-button> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<button class="reset" @click="reset">重置</button> |
|||
<button class="sure" @click="submit" :loading='loading' :disabled='loading'>确定</button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
<!-- 添加备件 --> |
|||
<u-popup v-model="isPopupShow" mode="center" border-radius="14"> |
|||
<view class="popup-title">添加备件</view> |
|||
<view class="popup"> |
|||
<u-form :model="form1" ref="form1Ref" label-width="160rpx"> |
|||
<u-form-item :label="`备件`" prop="number" required> |
|||
<view class="select" @click="openSingleColumn('number',form1.number,sparePartsList,'form1')"> |
|||
<view class="input" v-if='form1.number'> |
|||
{{form1.name}} |
|||
</view> |
|||
<view class="placeholder" v-else> |
|||
请选择备件 |
|||
</view> |
|||
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
|||
</view> |
|||
</u-form-item> |
|||
<u-form-item label="数量" prop="qty" required> |
|||
<u-input v-model="form1.qty" type="number" placeholder="请输入数量" /> |
|||
</u-form-item> |
|||
</u-form> |
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isPopupShow = false">取消</view> |
|||
<view class="sure" @click="addSpare">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<!-- 选择维修人员 --> |
|||
<u-popup v-model="isShowSelecUser" mode="center" border-radius="14"> |
|||
<view class="popup-title">选择维修人员</view> |
|||
<view class="popup"> |
|||
<u-checkbox-group @change="checkboxGroupChange"> |
|||
<u-checkbox v-model="item.checked" v-for="(item, index) in selecUserList" :key="index" |
|||
:name="item.id">{{item.name}}</u-checkbox> |
|||
</u-checkbox-group> |
|||
|
|||
</view> |
|||
<view class="popup-footer"> |
|||
<view @click="isShowSelecUser = false">取消</view> |
|||
<view class="sure" @click="chooseUser">确认</view> |
|||
</view> |
|||
</u-popup> |
|||
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' |
|||
:list="singleColumnList" @confirm="chooseSingleColumn" @cancle='singleColumnShow = false'></u-select> |
|||
<u-picker mode="time" v-model="datetimeShow" :default-time='datetimeDefaultValue' :params="params" @confirm='chooseDatetime' @cancle='datetimeShow = false'></u-picker> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as upkeepOrderApi from "@/api/upkeepOrder.js" |
|||
import * as sparePartsApi from "@/api/spareParts.js" |
|||
import * as deptApi from "@/api/dept.js" |
|||
import * as dictApi from "@/api/dict.js" |
|||
const { proxy} = getCurrentInstance() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
// 备件弹窗 |
|||
const isPopupShow = ref(false) |
|||
const sparePartsList = ref([]) |
|||
|
|||
const singleColumnShow = ref(false) |
|||
const singleColumnDefaultValue = ref([]) |
|||
const singleColumnList = ref([]) |
|||
const field = ref('') |
|||
const selecUserList = ref([])//负责人员 |
|||
const isShowSelecUser = ref(false) |
|||
const jxDetailsStatus = ref([])//完成情况 |
|||
const formatDate = ref('')//日期展示 |
|||
const form = ref({ |
|||
number: '', |
|||
name:'', |
|||
peoples: null, |
|||
estimatedMinutes: '', |
|||
actualMinutes: '', |
|||
chargePeoples: '', |
|||
status: null, |
|||
completionTime: '', |
|||
engineer: '', |
|||
uncompleted: '', |
|||
itemNumbers:[] |
|||
}) |
|||
const form1 = ref({ |
|||
number: "", |
|||
name: "", |
|||
qty: 0 |
|||
}) |
|||
// 时间参数 |
|||
const datetimeShow = ref(false) |
|||
const params = ref({ |
|||
year: true, |
|||
month: true, |
|||
day: true, |
|||
hour: true, |
|||
minute: true, |
|||
second: true, |
|||
timestamp: true, |
|||
}) |
|||
const datetimeDefaultValue = ref('') |
|||
const formatValue = ref('YYYY-MM-DD hh:mm:ss') |
|||
|
|||
const factoryAreaNumber = ref('') |
|||
const chooseUserList = ref([]) |
|||
// 验证正整数 |
|||
function validateInteger(value){ |
|||
if (value) { |
|||
const integerReg = /^[+]{0,1}(\d+)$/ |
|||
if (integerReg.test(value)) { |
|||
return true |
|||
} else { |
|||
return false |
|||
} |
|||
} else { |
|||
return false |
|||
} |
|||
} |
|||
// 触发提交表单 |
|||
function submit() { |
|||
// 校验 |
|||
if (form.value.peoples > 100) { |
|||
proxy.$modal.showToast('预估人数不得超出100') |
|||
return; |
|||
} |
|||
if (!form.value.actualMinutes) { |
|||
proxy.$modal.showToast('请输入实际分钟') |
|||
return; |
|||
} |
|||
if (!validateInteger(form.value.actualMinutes)) { |
|||
proxy.$modal.showToast('实际分钟请输入正整数') |
|||
return; |
|||
} |
|||
if (!form.value.chargePeoples) { |
|||
proxy.$modal.showToast('请选择负责人') |
|||
return; |
|||
} |
|||
if (!form.value.status) { |
|||
proxy.$modal.showToast('请选择完成情况') |
|||
return; |
|||
} |
|||
if (form.value.status == 0) { |
|||
if (!form.value.completionTime) { |
|||
proxy.$modal.showToast('请选择完成时间') |
|||
return; |
|||
} |
|||
} |
|||
if (form.value.status == 1) { |
|||
if (!form.value.uncompleted) { |
|||
proxy.$modal.showToast('请输入未完成原因') |
|||
return; |
|||
} |
|||
} |
|||
if (form.value.id) { |
|||
proxy.$modal.confirm('是否修改保养内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
upkeepOrderApi.upkeepOrderDetailUpdate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('修改成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} else { |
|||
proxy.$modal.confirm('是否添加保养内容').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
upkeepOrderApi.upkeepOrderDetailCreate(form.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data) { |
|||
proxy.$modal.showToast('添加成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
if(res.msg){ |
|||
proxy.$modal.showToast(res.msg) |
|||
}else{ |
|||
proxy.$modal.showToast('添加失败') |
|||
} |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
} |
|||
// 重置 |
|||
function reset() { |
|||
form.value.actualMinutes ='' |
|||
form.value.chargePeoples ='' |
|||
form.value.status =null |
|||
form.value.statusTxt ='' |
|||
form.value.completionTime ='' |
|||
form.value.engineer ='' |
|||
form.value.uncompleted ='' |
|||
form.value.itemNumbers =[] |
|||
formatDate.value = '' |
|||
|
|||
} |
|||
// 获取人员列表 |
|||
async function getSelecUser() { |
|||
let paramsData = { |
|||
classType: type.value, |
|||
factoryAreaNumber: factoryAreaNumber.value, |
|||
flag: 0 |
|||
} |
|||
let arr = [] |
|||
if (form.value.chargePeoples) { |
|||
arr = form.value.chargePeoples.split(',') |
|||
} |
|||
await deptApi.getSelecUser(paramsData).then(res => { |
|||
res.data.forEach(item => { |
|||
item.checked = false |
|||
arr.forEach(cur => { |
|||
if (item.id == cur) { |
|||
item.checked = true |
|||
} |
|||
}) |
|||
}) |
|||
selecUserList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开人员列表 |
|||
function openSelecUser() { |
|||
isShowSelecUser.value = true |
|||
} |
|||
function checkboxGroupChange(e) { |
|||
chooseUserList.value = e |
|||
} |
|||
// 多选选择框回显 |
|||
function selectFormatCheck(val, array) { |
|||
const arr = val.split(',').map(Number) |
|||
let str = array.filter(item => arr.includes(item.id)).map(item => item.name).join(',') |
|||
return str |
|||
} |
|||
// 选择人员 |
|||
function chooseUser() { |
|||
form.value.chargePeoples = chooseUserList.value.join(',') |
|||
isShowSelecUser.value = false |
|||
} |
|||
const whichForm = ref() |
|||
// 单列模式 |
|||
function openSingleColumn(fieldName, val, list, from) { |
|||
if (fieldName == 'deviceNumber' && form.value.id) return; |
|||
whichForm.value = from |
|||
singleColumnList.value = list |
|||
field.value = fieldName |
|||
if (val) { |
|||
singleColumnDefaultValue.value = [list.findIndex(item => item.value == val)] |
|||
} else { |
|||
singleColumnDefaultValue.value = [] |
|||
} |
|||
singleColumnShow.value = true |
|||
} |
|||
// 单列模式点击确定之后 |
|||
function chooseSingleColumn(e) { |
|||
if(whichForm.value == 'form'){ |
|||
form.value[field.value] = e[0].value |
|||
if(field.value=='status'){ |
|||
form.value.statusTxt = e[0].label |
|||
formatDate.value = '' |
|||
} |
|||
|
|||
}else if(whichForm.value == 'form1'){ |
|||
form1.value[field.value] = e[0].value |
|||
if(field.value=='number'){ |
|||
form1.value.name = e[0].label |
|||
} |
|||
} |
|||
|
|||
singleColumnShow.value = false |
|||
} |
|||
// 获取备件列表 |
|||
async function getSparePartsList() { |
|||
await sparePartsApi.getSparePartsList().then(res => { |
|||
res.data.map(item => { |
|||
item.value = item.number |
|||
item.label = item.name |
|||
}) |
|||
sparePartsList.value = res.data |
|||
}).catch(() => { }) |
|||
} |
|||
// 打开弹窗 |
|||
function open() { |
|||
form1.value = { |
|||
number: "", |
|||
name:'', |
|||
qty: 0 |
|||
} |
|||
isPopupShow.value = true |
|||
} |
|||
// 添加配件 |
|||
function addSpare() { |
|||
if (!form1.value.number) { |
|||
proxy.$modal.showToast('请选择备件') |
|||
return; |
|||
} |
|||
if (!form1.value.qty || form1.value.qty == 0) { |
|||
proxy.$modal.showToast('请输入数量') |
|||
return; |
|||
} |
|||
if (form.value.itemNumbers && form.value.itemNumbers.length > 0) { |
|||
let arr = form.value.itemNumbers.filter(item => item.number == form1.value.number) |
|||
if (arr && arr.length > 0) { |
|||
proxy.$modal.showToast('该备件已添加') |
|||
return; |
|||
} |
|||
} |
|||
|
|||
form.value.itemNumbers.push(form1.value) |
|||
isPopupShow.value = false |
|||
} |
|||
// 删除备件 |
|||
function delSpareParts(index) { |
|||
form.value.itemNumbers.splice(index, 1) |
|||
} |
|||
function openDatetime(fieldName, val, params, format) { |
|||
params.value = params |
|||
formatValue.value = format |
|||
field.value = fieldName |
|||
form.value[field.value] = val ? val : '' |
|||
datetimeDefaultValue.value = val ? val : proxy.$time.formatDate() |
|||
datetimeShow.value = true |
|||
} |
|||
// 日期模式点击确定之后 |
|||
function chooseDatetime(e) { |
|||
let array1 = [] |
|||
let array2 = [] |
|||
if (formatValue.value.indexOf('YYYY') > -1) { |
|||
array1.push(e.year) |
|||
} |
|||
if (formatValue.value.indexOf('MM') > -1) { |
|||
array1.push(e.month) |
|||
} |
|||
if (formatValue.value.indexOf('DD') > -1) { |
|||
array1.push(e.day) |
|||
} |
|||
if (formatValue.value.indexOf('hh') > -1) { |
|||
array2.push(e.hour) |
|||
} |
|||
if (formatValue.value.indexOf('mm') > -1) { |
|||
array2.push(e.minute) |
|||
} |
|||
if (formatValue.value.indexOf('ss') > -1) { |
|||
array2.push(e.second) |
|||
} |
|||
let str = array1.join('-') + ' ' + array2.join(':') |
|||
formatDate.value = str |
|||
form.value[field.value] = e.timestamp*1000 |
|||
} |
|||
onLoad(async(option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.factoryAreaNumber) factoryAreaNumber.value = option.factoryAreaNumber; |
|||
if (option.number) form.value.number = option.number; |
|||
if (option.data && JSON.parse(decodeURIComponent(option.data)) && JSON.parse(decodeURIComponent(option |
|||
.data)).id) { |
|||
form.value = JSON.parse(decodeURIComponent(option.data)) |
|||
form.value.itemNumbers = form.value.items |
|||
formatDate.value = form.value.completionTime ? proxy.$time.formatDate(form.value.completionTime) : '' |
|||
form.value.statusTxt = form.value.status == 0 ? '完成' :'未完成' |
|||
}; |
|||
jxDetailsStatus.value = await dictApi.getDict('jx_details_status') |
|||
|
|||
await getSelecUser() |
|||
await getSparePartsList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.add-form-container { |
|||
min-height: calc(100vh - 140rpx); |
|||
background: white; |
|||
padding: 0px 0rpx 140rpx; |
|||
} |
|||
.u-form-item{ |
|||
padding: 20rpx 30rpx; |
|||
} |
|||
.disabled{ |
|||
background: #f5f5f5; |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
|
|||
.reset { |
|||
background: #F5F5F5; |
|||
border-radius: 0px; |
|||
|
|||
&::after { |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.right-button { |
|||
background: #409eff; |
|||
color: white; |
|||
padding: 0rpx 30rpx; |
|||
border-radius: 16rpx; |
|||
text-align: center; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.select { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 72rpx; |
|||
width: 100%; |
|||
|
|||
.input { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: #000000; |
|||
} |
|||
|
|||
.placeholder { |
|||
flex: 1; |
|||
font-size: 28rpx; |
|||
color: rgb(192, 196, 204); |
|||
|
|||
} |
|||
} |
|||
|
|||
.title { |
|||
padding: 32rpx 0px; |
|||
position: relative; |
|||
|
|||
span { |
|||
position: absolute; |
|||
left: -16rpx; |
|||
color: #fa3534; |
|||
padding-top: 6rpx; |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 0px 30rpx; |
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
background: #F5F5F5; |
|||
border-radius: 12rpx; |
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 20rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx 30rpx 0px |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 30rpx 60rpx 30rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .u-checkbox-group { |
|||
display: grid !important; |
|||
} |
|||
</style> |
@ -0,0 +1,484 @@ |
|||
<template> |
|||
<!-- 详情 --> |
|||
<view class="detail-container"> |
|||
<view class="info"> |
|||
<view class="title"> |
|||
<view>保养工单</view> |
|||
</view> |
|||
<view class="dec"> |
|||
<view class="dec-item"> |
|||
<view>工单单号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>保养计划单号:</view> |
|||
<view>{{data.planNumber}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>故障类型:</view> |
|||
<view>{{data.faultTypeName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.createTime"> |
|||
<view>创建时间:</view> |
|||
<view>{{$time.formatDate(data.createTime)}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.creator"> |
|||
<view>创建人员:</view> |
|||
<view>{{data.creator}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.receivingTime"> |
|||
<view>接单时间:</view> |
|||
<view>{{$time.formatDate(data.receivingTime)}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.maintenanceName"> |
|||
<view>维修人员:</view> |
|||
<view>{{data.maintenanceName}}</view> |
|||
</view> |
|||
<view class="dec-item" v-if="data.completionTime"> |
|||
<view>完成时间:</view> |
|||
<view>{{$time.formatDate(data.completionTime)}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<div class="line"></div> |
|||
<view class="info" style="padding-bottom: 130rpx;"> |
|||
<view class="tab"> |
|||
<u-tabs :list="list" :is-scroll="false" bar-height="2" bar-width="250" v-model="current" |
|||
@change="change"></u-tabs> |
|||
</view> |
|||
<view> |
|||
<view class="title"> |
|||
<view>{{changeItem.name}}</view> |
|||
</view> |
|||
<view class="dec" v-if="current == 0"> |
|||
<view class="dec-item"> |
|||
<view>设备编号:</view> |
|||
<view>{{data.number}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备名称:</view> |
|||
<view>{{data.name}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>所属厂区:</view> |
|||
<view>{{data.factoryAreaName}}</view> |
|||
</view> |
|||
<view class="dec-item"> |
|||
<view>设备类型:</view> |
|||
<view>{{data.type == 'DEVICE'?'设备':data.type == 'TECH'?'工艺':'模具'}}</view> |
|||
</view> |
|||
</view> |
|||
<view class="list" v-if="current == 1"> |
|||
<view class="item " v-for="(item,index) in serviceList" :key="index" |
|||
@click="addSubForm('updata',item)"> |
|||
<view class="item-box"> |
|||
<view class="spare-title"> |
|||
<view class="title-txt"> |
|||
{{item.contents}} |
|||
</view> |
|||
</view> |
|||
<!-- <view class="dec2"> |
|||
<view>保养部位:</view> |
|||
<view>{{item.equipmentParts}}人</view> |
|||
</view> --> |
|||
<view class="dec2"> |
|||
<view>预估人数:</view> |
|||
<view v-if="item.peoples||item.peoples==0">{{item.peoples}}人</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>预估分钟:</view> |
|||
<view v-if='item.estimatedMinutes'>{{item.estimatedMinutes}}分钟</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>实际分钟:</view> |
|||
<view v-if='item.actualMinutes'>{{item.actualMinutes}}分钟</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>责任人:</view> |
|||
<view>{{item.chargePeoplesName}}</view> |
|||
</view> |
|||
<view class="dec2" > |
|||
<view>完成情况:</view> |
|||
<view>{{item.status===0 || item.status === '0'? '完成':item.status===1 ||item.status === '1'?'未完成':''}}</view> |
|||
</view> |
|||
<view class="dec2" v-if='item.status === 0 || item.status === "0"'> |
|||
<view>完成时间:</view> |
|||
<view>{{$time.formatDate(item.completionTime)}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
<view>工程师确认:</view> |
|||
<view>{{item.engineer}}</view> |
|||
</view> |
|||
<view class="dec2" v-if="item.status === 1 || item.status === '1'"> |
|||
<view>未完成原因:</view> |
|||
<view>{{item.uncompleted}}</view> |
|||
</view> |
|||
<view class="dec2"> |
|||
备件: |
|||
</view> |
|||
<view class="items" v-for="(cur,key) in item.items" :key="key"> |
|||
<view class="items-name"> |
|||
{{cur.name}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
备件编号:{{cur.number}} |
|||
</view> |
|||
<view class="items-dec"> |
|||
数量:{{cur.qty}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<!-- <u-icon name="minus-circle" color="#aaaaaa" size="60" ></u-icon> --> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="btns"> |
|||
<u-button type="primary" v-if="data.status == 'PENDING'" @click="orderClick(1)" :loading='loading' |
|||
:disabled='loading'>接单</u-button> |
|||
<u-button type="primary" v-if="data.status == 'PECEIVED'" @click="orderClick(2)" :loading='loading' |
|||
:disabled='loading'>完成</u-button> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as moldApi from "@/api/mold.js" |
|||
import * as upkeepOrderApi from "@/api/upkeepOrder.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const list = ref([{ |
|||
name: '设备信息' |
|||
}, { |
|||
name: '保养内容' |
|||
}]) |
|||
const current = ref(0) |
|||
const changeItem = ref({ |
|||
name: '设备信息', |
|||
value: 1 |
|||
}) |
|||
const data = ref() |
|||
const loading = ref(false) |
|||
const type = ref('') |
|||
const serviceList = ref([]) |
|||
const isTrue = ref(false) |
|||
function change(index) { |
|||
current.value = index |
|||
changeItem.value = list.value[current.value] |
|||
} |
|||
// 添加表格表单 |
|||
function addSubForm(clickType, item) { |
|||
if (data.value.status == 'PENDING') { |
|||
proxy.$modal.showToast('请先接单') |
|||
return |
|||
} |
|||
if (clickType == 'updata') { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/upkeepOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}&data=${encodeURIComponent(JSON.stringify(item))}` |
|||
) |
|||
} else { |
|||
proxy.$tab.navigateTo( |
|||
`/pages/upkeepOrder/addServiceRecord?type=${data.value.type}&factoryAreaNumber=${data.value.factoryAreaNumber}&number=${data.value.number}` |
|||
) |
|||
} |
|||
} |
|||
function orderClick(type) { |
|||
if(!serviceList.value || serviceList.value&&serviceList.value.length == 0){ |
|||
proxy.$modal.showToast('没有保养内容') |
|||
return; |
|||
} |
|||
// if(type == 2){ |
|||
// isTrue.value = serviceList.value.some(item=>item.items.length == 0) |
|||
// if(isTrue.value){ |
|||
// proxy.$modal.showToast('保养项目没有全部完成') |
|||
// return; |
|||
// } |
|||
// } |
|||
|
|||
const paramsData = { |
|||
id: data.value.id |
|||
} |
|||
let tips = data.value.status == 'PENDING' ? '是否接单?' : data.value.status == 'PECEIVED' ? '是否完成?' : '' |
|||
proxy.$modal.confirm(tips).then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
loading.value = true |
|||
if(type == 1){ |
|||
upkeepOrderApi.orderClick(paramsData).then((res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('操作成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('操作失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
}else if(type == 2){ |
|||
upkeepOrderApi.orderClickFinish(paramsData).then((res) => { |
|||
if (res.data) { |
|||
proxy.$modal.showToast('操作成功') |
|||
setTimeout(() => { |
|||
proxy.$tab.navigateBack() |
|||
loading.value = false |
|||
}, 1500) |
|||
} else { |
|||
proxy.$modal.showToast('操作失败') |
|||
loading.value = false |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
loading.value = false |
|||
}) |
|||
} |
|||
|
|||
}) |
|||
} |
|||
// 获取维修内容列表 |
|||
function getUpkeepOrderDetailList() { |
|||
upkeepOrderApi.upkeepOrderDetailList({ |
|||
number: data.value.number |
|||
}).then((res) => { |
|||
if (res.data) { |
|||
serviceList.value = res.data |
|||
} |
|||
}).catch(() => { }) |
|||
} |
|||
// 删除维修内容 |
|||
function delService(item) { |
|||
proxy.$modal.confirm('确定删除维修内容吗?').then(() => { |
|||
proxy.$modal.loading('加载中') |
|||
upkeepOrderApi.upkeepOrderDetailDelete(item.id).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
getUpkeepOrderDetailList() |
|||
}).catch(() => { }) |
|||
}) |
|||
} |
|||
|
|||
onLoad(async (option) => { |
|||
if (option.type) type.value = option.type; |
|||
if (option.data) { |
|||
data.value = JSON.parse(decodeURIComponent(option.data)) |
|||
|
|||
} |
|||
changeItem.value = list.value[current.value] |
|||
|
|||
}) |
|||
onShow(() => { |
|||
getUpkeepOrderDetailList() |
|||
}) |
|||
|
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.detail-container{ |
|||
min-height: 100vh; |
|||
background: white; |
|||
} |
|||
.line{ |
|||
background: #f5f5f5; |
|||
height: 20rpx; |
|||
} |
|||
.info { |
|||
background: white; |
|||
} |
|||
|
|||
.tab { |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
} |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
flex: 1; |
|||
border-left: 10rpx solid #409eff; |
|||
padding-left: 20rpx; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding: 30rpx; |
|||
|
|||
.dec-item { |
|||
padding-bottom: 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 200rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.dec2 { |
|||
padding: 10rpx 30rpx; |
|||
display: flex; |
|||
|
|||
view { |
|||
&:nth-child(1) { |
|||
width: 180rpx; |
|||
} |
|||
|
|||
&:nth-child(2) { |
|||
color: #888888; |
|||
flex: 1; |
|||
width: 0px; |
|||
word-wrap: break-word; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
.items { |
|||
margin: 20rpx 30rpx; |
|||
border-radius: 12rpx; |
|||
background: #F5F5F5; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.items-name { |
|||
padding: 20rpx; |
|||
border-bottom: 1px solid #dedede; |
|||
} |
|||
|
|||
.items-dec { |
|||
padding: 0px 20rpx; |
|||
margin-top: 20rpx; |
|||
} |
|||
} |
|||
|
|||
.popup-title { |
|||
text-align: center; |
|||
font-size: 32rpx; |
|||
font-weight: bold; |
|||
color: #409eff; |
|||
padding: 30rpx |
|||
} |
|||
|
|||
.popup { |
|||
width: 600rpx; |
|||
padding: 0rpx 60rpx 0rpx; |
|||
|
|||
} |
|||
|
|||
.popup-footer { |
|||
display: flex; |
|||
border-top: 1px solid #e4e4e4; |
|||
|
|||
view { |
|||
line-height: 100rpx; |
|||
flex: 1; |
|||
text-align: center; |
|||
|
|||
&.sure { |
|||
color: #409eff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
left: 0px; |
|||
width: 100%; |
|||
background: white; |
|||
z-index: 22; |
|||
} |
|||
|
|||
.btns { |
|||
display: flex; |
|||
|
|||
padding: 20rpx; |
|||
box-shadow: 0px -2rpx 20rpx rgba(0, 0, 0, 0.1); |
|||
|
|||
|
|||
button { |
|||
flex: 1; |
|||
margin: 0px 10rpx; |
|||
} |
|||
|
|||
.sure { |
|||
background: #409eff; |
|||
color: white; |
|||
border-radius: 8rpx; |
|||
|
|||
&::after { |
|||
border: 1px solid #409eff; |
|||
border-radius: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
padding: 20rpx; |
|||
|
|||
.item { |
|||
display: flex; |
|||
margin-bottom: 20rpx; |
|||
|
|||
.item-box { |
|||
border-radius: 12rpx; |
|||
border: 1px solid #dedede; |
|||
border-radius: 12rpx; |
|||
|
|||
flex: 1; |
|||
width: 0rpx; |
|||
} |
|||
|
|||
.spare-title { |
|||
padding: 20rpx 30rpx; |
|||
border-bottom: 1px solid #e4e4e4; |
|||
display: flex; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-size: 30rpx; |
|||
font-weight: bold; |
|||
flex: 1; |
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
color: #9c9c9c; |
|||
padding: 0rpx 30rpx 20rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
.add-btn { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
} |
|||
</style> |
@ -0,0 +1,225 @@ |
|||
<template> |
|||
<!-- 保养工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="保养工单"> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index" > |
|||
<view class="" @click="itemClick(item,index)"> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
|||
</view> |
|||
<view class="dec"> |
|||
保养单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
保养计划单号:<span>{{item.planNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${params.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as upkeepOrderApi from "@/api/upkeepOrder.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
type: '', |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
function itemClick(item, index) { |
|||
proxy.$tab.navigateTo(`/pages/upkeepOrder/detail?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
function addForm(item) { |
|||
proxy.$tab.navigateTo(`/pages/upkeepOrder/addForm?type=${params.value.type}&data=${encodeURIComponent(JSON.stringify(item))}`) |
|||
} |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await upkeepOrderApi.upkeepOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container{ |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,229 @@ |
|||
<template> |
|||
<!-- 保养工单 --> |
|||
<view class="container"> |
|||
<u-navbar back-icon-color='#fff' :background="{ background: '#409eff'}" back-text="" title-color='#fff' |
|||
title="保养工单"> |
|||
</u-navbar> |
|||
<view class="list"> |
|||
<view class="item" v-for="(item,index) in list" :key="index"> |
|||
<view class=""> |
|||
<view class="title"> |
|||
<view class="title-txt"> |
|||
{{item.describes}} |
|||
</view> |
|||
<u-tag text="待接单" v-if="item.status == 'PENDING'" bg-color='rgba(255,255,255,0)' color='#fe8463' |
|||
border-color='#fe8463' type="primary" shape='circle' /> |
|||
<u-tag text="已撤回" v-else-if="item.status=='REJECTED'" bg-color='rgba(255,255,255,0)' |
|||
color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle' /> |
|||
<u-tag text="已转办" v-else-if="item.status=='TRANSFERRED'" bg-color='rgba(255,255,255,0)' |
|||
color='#e01f54' border-color='#e01f54' type="success" shape='circle' /> |
|||
<u-tag text="已接单" v-else-if="item.status=='PECEIVED'" bg-color='rgba(255,255,255,0)' |
|||
color='#005eaa' border-color='#005eaa ' type="error" shape='circle' /> |
|||
<u-tag text="已验证" v-else-if="item.status=='VERIFIED'" bg-color='rgba(255,255,255,0)' |
|||
color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle' /> |
|||
<u-tag text="已完成" v-else-if="item.status=='COMPLETED'" bg-color='rgba(255,255,255,0)' |
|||
color='#2ba471' border-color='#2ba471' type="info" shape='circle' /> |
|||
</view> |
|||
<view class="dec"> |
|||
保养单号:<span>{{item.number}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
保养计划单号:<span>{{item.planNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}编号:<span>{{item.deviceNumber}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
{{`${item.type=='DEVICE'?'设备' : '模具'}`}}名称:<span>{{item.name}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
所属厂区:<span>{{item.factoryAreaName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
故障类型:<span>{{item.faultTypeName}}</span> |
|||
</view> |
|||
<view class="dec"> |
|||
完成时间:<span>{{$time.formatDate(item.completionTime)}}</span> |
|||
</view> |
|||
</view> |
|||
<view class="bottom"> |
|||
<view class="time" style="flex: 1;"> |
|||
{{`${$time.formatDate(item.createTime)}`}} |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view style="height: 94rpx;padding-top: 30rpx;"> |
|||
<u-loadmore :status="status" v-if="status != 'loadmore'" /> |
|||
</view> |
|||
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { |
|||
onLoad, |
|||
onShow, |
|||
onReachBottom |
|||
} from '@dcloudio/uni-app' |
|||
import { |
|||
ref, |
|||
getCurrentInstance |
|||
} from 'vue' |
|||
import * as upkeepOrderApi from "@/api/upkeepOrder.js" |
|||
const { proxy } = getCurrentInstance() |
|||
const params = ref({ |
|||
pageNo: 1, |
|||
pageSize: 10, |
|||
flag: 1 |
|||
}) |
|||
const status = ref('loadmore') //是否显示没有更多了 |
|||
const list = ref([]) |
|||
async function getList() { |
|||
if (status.value == 'nomore') return; |
|||
status.value = 'loading'; |
|||
proxy.$modal.loading('加载中') |
|||
await upkeepOrderApi.upkeepOrderPage(params.value).then((res) => { |
|||
proxy.$modal.closeLoading() |
|||
if (res.data.list.length > 0) { |
|||
list.value = list.value.concat(res.data.list); |
|||
params.value.pageNo++; |
|||
status.value = 'loadmore' |
|||
} else { |
|||
status.value = 'nomore' |
|||
} |
|||
}).catch(() => { |
|||
proxy.$modal.closeLoading() |
|||
}) |
|||
} |
|||
onLoad((option) => { |
|||
if (option.type) params.value.type = option.type; |
|||
}) |
|||
onShow(() => { |
|||
params.value.pageNo = 1 |
|||
list.value = [] |
|||
status.value = 'loadmore' |
|||
getList() |
|||
|
|||
}) |
|||
onReachBottom(() => { |
|||
getList() |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.container { |
|||
background: #f5f5f5; |
|||
min-height: 100vh; |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
.list { |
|||
background: #f5f5f5; |
|||
margin-top: 20rpx; |
|||
|
|||
.item { |
|||
padding: 30rpx 30rpx 0px 30rpx; |
|||
margin-top: 20rpx; |
|||
background: white; |
|||
|
|||
.title { |
|||
display: flex; |
|||
align-items: center; |
|||
padding-bottom: 20rpx; |
|||
|
|||
.title-txt { |
|||
color: #409eff; |
|||
font-weight: bold; |
|||
font-size: 36rpx; |
|||
width: 0px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.time { |
|||
color: #919191; |
|||
|
|||
} |
|||
} |
|||
|
|||
.dec { |
|||
padding-bottom: 20rpx; |
|||
|
|||
span { |
|||
color: #999999; |
|||
} |
|||
} |
|||
|
|||
.last { |
|||
padding-bottom: 30rpx; |
|||
} |
|||
|
|||
.bottom { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
border-top: 1px solid #E4E4E4; |
|||
padding: 20rpx 0px; |
|||
position: relative; |
|||
|
|||
|
|||
.button { |
|||
position: absolute; |
|||
right: 0rpx; |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
Loading…
Reference in new issue