detail.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. <template>
  2. <view class="page">
  3. <scroll-view scroll-y="true" class="detail">
  4. <view class="form-content">
  5. <uni-forms ref="maintenanceFormRef" labelWidth="140px" :model="mainWorkOrder">
  6. <!-- 工单名称 -->
  7. <uni-forms-item class="form-item" :label="$t('workOrder.workOrderName')" name="name"
  8. :required="false">
  9. <uni-easyinput style="text-align: right" :inputBorder="false" :clearable="false"
  10. :disabled="true" :styles="{disableColor:'#fff'}" v-model="mainWorkOrder.name"
  11. :placeholder="' '" />
  12. </uni-forms-item>
  13. <!-- 工单编号 -->
  14. <uni-forms-item class="form-item" :label="$t('workOrder.workOrderNumber')" name="orderNumber"
  15. :required="false">
  16. <uni-easyinput style="text-align: right" :inputBorder="false" :clearable="false"
  17. :disabled="true" :styles="{disableColor:'#fff'}" v-model="mainWorkOrder.orderNumber"
  18. :placeholder="' '" />
  19. </uni-forms-item>
  20. <!-- 保养类型 -->
  21. <uni-forms-item class="form-item" :label="$t('maintenanceWorkOrder.maintenanceType')"
  22. name="outsourcingFlag" :required="false">
  23. <uni-data-select :styles="{disableColor:'#fff'}" :clear="false" :disabled="true"
  24. v-model="mainWorkOrder.outsourcingFlag" :localdata="outsourcingFlagRange">
  25. </uni-data-select>
  26. </uni-forms-item>
  27. <!-- 实际保养开始时间 -->
  28. <uni-forms-item class="form-item" :label="$t('maintenanceWorkOrder.actualMaintenanceStartTime')"
  29. name="actualStartTime" :required="false">
  30. <uni-datetime-picker type="datetime" :border="false" :end="dateMax" :placeholder="' '"
  31. :clear-icon="false" :disabled="true"
  32. :style="{color: mainWorkOrder.actualStartTime ? '#333' : '#999', 'font-size':mainWorkOrder.actualStartTime ? '14px !important' : 'inherit !important' }"
  33. v-model="mainWorkOrder.actualStartTime">
  34. </uni-datetime-picker>
  35. </uni-forms-item>
  36. <!-- return-type="timestamp" -->
  37. <!-- 实际保养结束时间 -->
  38. <uni-forms-item class="form-item" :label="$t('maintenanceWorkOrder.actualEndTime')"
  39. name="actualEndTime" :required="false">
  40. <uni-datetime-picker type="datetime" :border="false" :end="dateMax" :placeholder="' '"
  41. :clear-icon="false" :disabled="true"
  42. :style="{color: mainWorkOrder.actualEndTime ? '#333' : '#999', 'font-size':mainWorkOrder.actualEndTime ? '14px !important' : 'inherit !important' }"
  43. v-model="mainWorkOrder.actualEndTime">
  44. </uni-datetime-picker>
  45. </uni-forms-item>
  46. <!-- 保养费用 -->
  47. <uni-forms-item class="form-item" :label="$t('maintenanceWorkOrder.maintenanceCost')" name="cost"
  48. :required="false">
  49. <uni-easyinput style="text-align: right" :inputBorder="false" :clearable="false"
  50. :styles="{disableColor:'#fff'}" v-model="mainWorkOrder.cost" :disabled="true" />
  51. </uni-forms-item>
  52. <!-- 其他费用 -->
  53. <uni-forms-item class="form-item" :label="$t('maintenanceWorkOrder.otherCost')" :required="false"
  54. name="otherCost">
  55. <uni-easyinput style="text-align: right" :inputBorder="false" :clearable="false"
  56. :disabled="true" :styles="{disableColor:'#fff'}" v-model="mainWorkOrder.otherCost"
  57. :placeholder="' '" />
  58. </uni-forms-item>
  59. <!-- 备注 -->
  60. <uni-forms-item class="form-item" :label="$t('operation.remark')" :required="false" name="remark">
  61. <uni-easyinput style="text-align: right" type="textarea" :autoHeight="true" :inputBorder="false"
  62. :disabled="true" :clearable="false" :styles="{disableColor:'#fff'}"
  63. v-model="mainWorkOrder.remark" :placeholder="' '" />
  64. </uni-forms-item>
  65. </uni-forms>
  66. <view class="device-section" v-for="bom in mainWorkOrderBom">
  67. <!-- 设备编码 -->
  68. <view class="item-module">
  69. <view class="item-content flex-row align-center justify-between">
  70. <view class="item-title">
  71. <span class="item-title-width">{{$t('device.deviceCode')}}:</span>
  72. </view>
  73. <view class="item-title">
  74. <span>{{bom.deviceCode}}</span>
  75. </view>
  76. </view>
  77. <view class="module-border"> </view>
  78. </view>
  79. <!-- 设备名称 -->
  80. <view class="item-content flex-row align-center justify-between">
  81. <view class="item-title">
  82. <span class="item-title-width">{{$t('device.deviceName')}}:</span>
  83. </view>
  84. <view class="item-title">
  85. <span>{{bom.deviceName}}</span>
  86. </view>
  87. </view>
  88. <!-- 累计运行时间 -->
  89. <view class="item-content flex-row align-center justify-between">
  90. <view class="item-title">
  91. <span
  92. class="item-title-width">{{$t('maintenanceWorkOrder.accumulatedRunningTime')}}(h):</span>
  93. </view>
  94. <view class="item-title">
  95. <span>{{bom.totalRunTime}}</span>
  96. </view>
  97. </view>
  98. <!-- 累计运行里程 -->
  99. <view class="item-content flex-row align-center justify-between">
  100. <view class="item-title">
  101. <span
  102. class="item-title-width">{{$t('maintenanceWorkOrder.accumulatedRunningMileage')}}(km):</span>
  103. </view>
  104. <view class="item-title">
  105. <span>{{bom.totalMileage}}</span>
  106. </view>
  107. </view>
  108. <!-- 保养项 -->
  109. <view class="item-content flex-row align-center justify-between">
  110. <view class="item-title">
  111. <span class="item-title-width">{{$t('maintenanceWorkOrder.maintenanceItems')}}:</span>
  112. </view>
  113. <view class="item-title">
  114. <span>{{bom.name}}</span>
  115. </view>
  116. </view>
  117. <!-- 物料数量 -->
  118. <!-- <view class="item-content flex-row align-center justify-between">
  119. <view class="item-title">
  120. <span class="item-title-width">{{$t('workOrder.materialCount')}}:</span>
  121. </view>
  122. <view class="item-title">
  123. <span>{{bom.materialCount}}</span>
  124. </view>
  125. </view> -->
  126. <!-- 操作按钮 -->
  127. <view class="item-opera flex-row justify-end">
  128. <button type="primary" :plain="false"
  129. @click="onMaterialView(bom)">{{$t('workOrder.materialDetails')}}</button>
  130. </view>
  131. </view>
  132. </view>
  133. </scroll-view>
  134. </view>
  135. <!-- <deviceMultiple ref="deviceMultipleRef" @multiple-devide-submit="onChooseDevice" />-->
  136. <materialsChoose ref="materialsChooseRef" :deviceId="addMateriaItem.id" :materialItem="addMateriaItem"
  137. @material-submit="materialSubmit" />
  138. <materials-view ref="materialsViewRef" />
  139. </template>
  140. <script setup>
  141. import {
  142. onLoad,
  143. onReady
  144. } from '@dcloudio/uni-app'
  145. import {
  146. reactive,
  147. ref,
  148. onMounted,
  149. onBeforeUnmount,
  150. nextTick,
  151. getCurrentInstance
  152. } from 'vue';
  153. import {
  154. getMaintenanceDetail,
  155. getWorkOrderBOMs
  156. } from '@/api/maintenance'
  157. import {
  158. getRandomNumber
  159. } from '@/utils/methods'
  160. import dayjs from 'dayjs';
  161. // import deviceMultiple from '@/components/device/multiple.vue'
  162. import materialsChoose from '@/components/materials/choose.vue'
  163. import materialsView from '@/components/materials/view.vue'
  164. // 引用全局变量$t
  165. const {
  166. appContext
  167. } = getCurrentInstance();
  168. const t = appContext.config.globalProperties.$t;
  169. const outsourcingFlagRange = ref([{
  170. value: 0,
  171. text: t('maintenanceWorkOrder.maintenanceTypeIn')
  172. },
  173. {
  174. value: 1,
  175. text: t('maintenanceWorkOrder.maintenanceTypeOut')
  176. },
  177. ])
  178. // 获取当前时间
  179. const now = dayjs().format('YYYY-MM-DD HH:mm:ss')
  180. const dateMax = ref(now)
  181. const workOrderId = ref()
  182. const mainWorkOrder = ref({})
  183. const getDetail = (id) => {
  184. getMaintenanceDetail({
  185. id: id
  186. }).then(res => {
  187. console.log('getMaintenanceDetail', res.data)
  188. mainWorkOrder.value = res.data
  189. })
  190. }
  191. // 保养工单明细
  192. const mainWorkOrderBom = ref([])
  193. const onDeviceBomList = () => {
  194. getWorkOrderBOMs({
  195. workOrderId: workOrderId.value
  196. }).then(res => {
  197. console.log('getWorkOrderBOMs', res.data)
  198. mainWorkOrderBom.value = res.data
  199. }).catch(err => {
  200. })
  201. }
  202. // 物料选择
  203. const materialsChooseRef = ref(null)
  204. const addMateriaItem = ref({})
  205. const onMaterialChoose = (item) => {
  206. console.log('onMaterialChoose', item)
  207. addMateriaItem.value = item
  208. materialsChooseRef.value.open()
  209. }
  210. // 保养工单 - 物料
  211. const mainWorkOrderMaterials = ref([])
  212. const materialSubmit = (material) => {
  213. console.log('material - submit', material)
  214. // 判断mainWorkOrderMaterials中是否存在相同id的物料,如果存在,则更新数量,如果不存在,则添加
  215. const index = mainWorkOrderMaterials.value.findIndex(item => item.id === material.id)
  216. if (index !== -1) {
  217. mainWorkOrderMaterials.value[index].quantity += material.quantity
  218. } else {
  219. mainWorkOrderMaterials.value.push({
  220. ...material,
  221. id: getRandomNumber(),
  222. workOrderId: mainWorkOrder.id, // 保养工单id
  223. bomNodeId: addMateriaItem.value.bomNodeId,
  224. name: addMateriaItem.value.name,
  225. code: addMateriaItem.value.code
  226. })
  227. // 修改是否选择物料
  228. mainWorkOrderBom.value.forEach(bom => {
  229. if (bom.bomNodeId === addMateriaItem.value.bomNodeId) {
  230. bom.materialSelected = true
  231. }
  232. })
  233. }
  234. // 计算保养费用
  235. mainWorkOrder.value.cost = mainWorkOrderMaterials.value.reduce((total, item) => {
  236. return total + item.quantity * item.unitPrice
  237. }, 0)
  238. console.log('mainWorkOrderMaterials', mainWorkOrderMaterials.value)
  239. }
  240. const materialsViewRef = ref(null)
  241. const onMaterialView = (item) => {
  242. console.log('onMaterialView', item)
  243. // materialsViewRef.value.openDrawer()
  244. uni.navigateTo({
  245. url: '/pages/material/view?workOrderId=' + workOrderId.value + '&bomId=' + item.id +
  246. '&bomNodeId=' + item.bomNodeId,
  247. });
  248. }
  249. onMounted(() => {
  250. // 监听子页面提交的事件
  251. console.log('onMounted')
  252. // uni.$on('multiple-devide-submit', (data) => {
  253. // console.log('接收到子页面数据:', data);
  254. // selectedDevices.value = data
  255. // onDeviceBomList()
  256. // });
  257. })
  258. onBeforeUnmount(() => {
  259. // 移除监听
  260. console.log('onBeforeUnmount')
  261. // uni.$off('multiple-devide-submit');
  262. })
  263. onLoad((option) => {
  264. console.log('onLoad', option)
  265. workOrderId.value = option.id
  266. getDetail(option.id)
  267. onDeviceBomList()
  268. })
  269. onReady(() => {
  270. // 设置自定义表单校验规则,必须在节点渲染完毕后执行
  271. // this.$refs.customForm.setRules(this.customRules)
  272. })
  273. </script>
  274. <style lang="scss" scoped>
  275. @import "@/style/work-order-detail.scss";
  276. .detail {
  277. position: relative;
  278. height: calc(100%);
  279. }
  280. :deep(.is-disabled) {
  281. color: #333333 !important;
  282. }
  283. </style>