|
@@ -0,0 +1,470 @@
|
|
|
+//工序(计时)报工
|
|
|
+import ProcessRequest from '../common/util/request/ProcessRequest'
|
|
|
+import ProcessInfo from '../viewmodel/process/ProcessInfo'
|
|
|
+import ReporterInfo from '../viewmodel/process/ReporterInfo'
|
|
|
+import ReportInfo from '../viewmodel/process/ReporterInfo'
|
|
|
+import TaskSeqVO from '../viewmodel/process/TaskSeqInfo'
|
|
|
+import RequestParamModel from '../viewmodel/RequestParamModel'
|
|
|
+import WorkOrderInfo from '../viewmodel/WorkOrderInfo'
|
|
|
+import promptAction from '@ohos.promptAction'
|
|
|
+import ProcessReportTimeBased from '../viewmodel/process/ProcessReportTimeBased'
|
|
|
+import { BindTaskSeq } from '../viewmodel/process/BindTaskSeq'
|
|
|
+
|
|
|
+@CustomDialog
|
|
|
+export struct ReportTimeBasedDialog {
|
|
|
+
|
|
|
+ controller: CustomDialogController
|
|
|
+ private scrollerList: Scroller = new Scroller()
|
|
|
+
|
|
|
+ //选中的工序id
|
|
|
+ @Link selectOperationId: string
|
|
|
+ //从首页传来的工单
|
|
|
+ @Link selectWorkOder: WorkOrderInfo
|
|
|
+ // 当前生产过程
|
|
|
+ @Link process: ProcessInfo
|
|
|
+ //查询报工
|
|
|
+ @Link reporterList: ReportInfo[]
|
|
|
+ //工序名字
|
|
|
+ selectOperationName: string = ''
|
|
|
+ //当前工序已报工数量
|
|
|
+ @State reportedNum: number = 0
|
|
|
+ //计划报工数量
|
|
|
+ @State planReportNum: number = 0
|
|
|
+ // 记录当前点击的报工人索引
|
|
|
+ @State currentReporterIndex: number = 0;
|
|
|
+ //当前工位
|
|
|
+ @Consume('currentStationId') currentStationId: string
|
|
|
+ // 当前登录用户名称
|
|
|
+ @Consume('currentUserName') userName: string
|
|
|
+ // 当前登录用户名称
|
|
|
+ @Consume('currentUserId') currentUserId: number
|
|
|
+ @Consume ('bindTaskSeq') bindTaskSeq: BindTaskSeq[]
|
|
|
+ // 开工时间
|
|
|
+ startWorkTime: string = ''
|
|
|
+
|
|
|
+ //选择报工数量
|
|
|
+ onSelectReportNum: (index:number) => void = () => {}
|
|
|
+ //选择不良品数量
|
|
|
+ onSelectDefectNum: (index:number) => void = () => {}
|
|
|
+ //选择用户用时占比
|
|
|
+ onSelectWorkHourRate: (index:number) => void = () => {}
|
|
|
+ //选择报工人
|
|
|
+ onSelectReporter: (index:number) => void = () => {}
|
|
|
+ // 报工后清除相关数据
|
|
|
+ clearSelectData: () => void = () => {}
|
|
|
+ //加载第一个报工人(无法删除)
|
|
|
+ loadFirstReporter=async ()=>{
|
|
|
+ if (this.reporterList.length > 0) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const firstReporter: ReporterInfo = {}
|
|
|
+ firstReporter.userName = this.userName
|
|
|
+ firstReporter.userId = this.currentUserId.toString()
|
|
|
+ firstReporter.workingHoursRate = 1
|
|
|
+ this.reporterList.push(firstReporter)
|
|
|
+ }
|
|
|
+
|
|
|
+ async aboutToAppear() {
|
|
|
+ this.loadFirstReporter()
|
|
|
+ // 查询所有流转卡号
|
|
|
+ let res = await ProcessRequest.post('/api/v1/plan/task/list', {
|
|
|
+ stationId: this.currentStationId,
|
|
|
+ workOrderCode: this.selectWorkOder.workOrderCode!,
|
|
|
+ operationId: this.selectOperationId
|
|
|
+ } as RequestParamModel) as TaskSeqVO[];
|
|
|
+ if (!res || res.length <= 0) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.planReportNum = res.length
|
|
|
+ // 计算已报工数量
|
|
|
+ let num: number = 0
|
|
|
+ for (const element of res) {
|
|
|
+ if (element.state! === '2') {
|
|
|
+ num++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.reportedNum = num
|
|
|
+ }
|
|
|
+
|
|
|
+ build() {
|
|
|
+ Column() {
|
|
|
+ Column() {
|
|
|
+ Text('工序报工')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_30'))
|
|
|
+ }
|
|
|
+ .height('10%')
|
|
|
+ .width('100%')
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+
|
|
|
+ Column(){
|
|
|
+ Row(){
|
|
|
+ Column({space:3}){
|
|
|
+ Text(this.selectWorkOder.materialName)
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ Text(this.selectWorkOder.materialCode)
|
|
|
+ .fontSize($r('app.float.fontSize_12'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Lighter)
|
|
|
+ Row(){
|
|
|
+ Text('工单 ')
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Lighter)
|
|
|
+ Text(this.selectWorkOder.workOrderCode)
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Bold)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .height('100%')
|
|
|
+ .width('30%')
|
|
|
+ .justifyContent(FlexAlign.End)
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ Row(){
|
|
|
+ Text('工序 ')
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Lighter)
|
|
|
+ Text(this.selectOperationName)
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Bold)
|
|
|
+ }
|
|
|
+ .height('100%')
|
|
|
+ .width('40%')
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .alignItems(VerticalAlign.Bottom)
|
|
|
+ Column(){
|
|
|
+ Row(){
|
|
|
+ Text(`${this.reportedNum}/`)
|
|
|
+ .fontSize($r('app.float.fontSize_38'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ Text(`${this.planReportNum}`)
|
|
|
+ .fontSize($r('app.float.fontSize_38'))
|
|
|
+ .fontColor($r('app.color.60FFFFFF'))
|
|
|
+ }
|
|
|
+ Text('当前工序已报工/计划')
|
|
|
+ .fontSize($r('app.float.fontSize_12'))
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontWeight(FontWeight.Lighter)
|
|
|
+ }
|
|
|
+ .height('100%')
|
|
|
+ .width('30%')
|
|
|
+ .justifyContent(FlexAlign.End)
|
|
|
+ .alignItems(HorizontalAlign.End)
|
|
|
+ }
|
|
|
+ .height('14.4%')
|
|
|
+ .width('100%')
|
|
|
+ .alignItems(VerticalAlign.Bottom)
|
|
|
+
|
|
|
+ Divider()
|
|
|
+ .vertical(false)
|
|
|
+ .width('100%')
|
|
|
+ .strokeWidth(1)
|
|
|
+ .color($r('app.color.15FFFFFF'))
|
|
|
+ .height('3.1%')
|
|
|
+ // 报工流水号、不良流水号选择
|
|
|
+ Row({space: 5}) {
|
|
|
+ Column() {
|
|
|
+ Text(`报工数量`)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontWeight(FontWeight.Regular)
|
|
|
+ .height('27%')
|
|
|
+ .margin({left:'2%'})
|
|
|
+ Row(){
|
|
|
+ Text(this.reporterList && this.reporterList[0].reportNum ? this.reporterList[0].reportNum! : '0')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .margin({left:'8%'})
|
|
|
+ .width('82%')
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ Text('>')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ .width('10%')
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ .height('73%')
|
|
|
+ .backgroundColor($r('app.color.20FFFFFF'))
|
|
|
+ .onClick(()=>{
|
|
|
+ this.onSelectReportNum(0)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('30%')
|
|
|
+ .height('100%')
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ Column(){
|
|
|
+ Text(`不良品数量`)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontWeight(FontWeight.Regular)
|
|
|
+ .height('27%')
|
|
|
+ .margin({left:'2%'})
|
|
|
+ Row(){
|
|
|
+ Text(this.reporterList && this.reporterList[0].defectNum ? this.reporterList[0].defectNum! : '0')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .margin({left:'8%'})
|
|
|
+ .width('82%')
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ Text('>')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ .width('10%')
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ .backgroundColor($r('app.color.20FFFFFF'))
|
|
|
+ .height('73%')
|
|
|
+ .onClick(()=>{
|
|
|
+ this.onSelectDefectNum(0)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('30%')
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ .height('100%')
|
|
|
+ Blank()
|
|
|
+ Text('开工时间:' +this.startWorkTime)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_12'))
|
|
|
+ .fontWeight(FontWeight.Lighter)
|
|
|
+ }
|
|
|
+ .width('100%')
|
|
|
+ .height('17.2%')
|
|
|
+ Row().height('7.9%')
|
|
|
+ // 添加报工人
|
|
|
+ Row(){
|
|
|
+ Image($r('app.media.general_create'))
|
|
|
+ .width($r('app.float.virtualSize_24'))
|
|
|
+ .height($r('app.float.virtualSize_24'))
|
|
|
+ .fillColor($r('app.color.0A84FF'))
|
|
|
+ Text('添加报工人')
|
|
|
+ .fontColor($r('app.color.0A84FF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .margin({left:'4%'})
|
|
|
+ }
|
|
|
+ .height('8.8%')
|
|
|
+ .width('14%')
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .backgroundColor($r('app.color.20FFFFFF'))
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ .onClick(() => {
|
|
|
+ const newReporter: ReportInfo = {}
|
|
|
+ // 默认占比为剩余占比
|
|
|
+ if (this.reporterList && this.reporterList.length > 0) {
|
|
|
+ let rateTotal: number = 1
|
|
|
+ for (const element of this.reporterList) {
|
|
|
+ if (element.workingHoursRate && element.workingHoursRate > 0) {
|
|
|
+ rateTotal -= element.workingHoursRate
|
|
|
+ }
|
|
|
+ }
|
|
|
+ newReporter.workingHoursRate = rateTotal
|
|
|
+ }
|
|
|
+ this.reporterList.push(newReporter)
|
|
|
+ })
|
|
|
+
|
|
|
+ Column(){
|
|
|
+ List({space: 8, scroller: this.scrollerList}) {
|
|
|
+ ForEach(this.reporterList, (item: ReporterInfo, index: number) => {
|
|
|
+ ListItem() {
|
|
|
+ Row(){
|
|
|
+ Column(){
|
|
|
+ Text(`报工人${index+1}`)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontWeight(FontWeight.Regular)
|
|
|
+ .height('30%')
|
|
|
+ .margin({left:'2%'})
|
|
|
+ Row(){
|
|
|
+ Text(item.userName)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .margin({left:'8%'})
|
|
|
+ .width('82%')
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ Text('>')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ .width('10%')
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ .height('70%')
|
|
|
+ .enabled(index!=0)
|
|
|
+ .backgroundColor($r('app.color.20FFFFFF'))
|
|
|
+ .onClick(()=>{
|
|
|
+ this.onSelectReporter(index)
|
|
|
+ this.currentReporterIndex = index;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('29%')
|
|
|
+ .height('100%')
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ Column(){
|
|
|
+ Text(`用时占比`)
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_16'))
|
|
|
+ .fontWeight(FontWeight.Regular)
|
|
|
+ .height('30%')
|
|
|
+ .margin({left:'2%'})
|
|
|
+ Row(){
|
|
|
+ Text(item.workingHoursRate ? item.workingHoursRate * 100 + '%' : '0%')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .margin({left:'8%'})
|
|
|
+ .width('82%')
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ Text('>')
|
|
|
+ .fontColor($r('app.color.FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_24'))
|
|
|
+ .textAlign(TextAlign.Start)
|
|
|
+ .width('10%')
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ .height('70%')
|
|
|
+ .backgroundColor($r('app.color.20FFFFFF'))
|
|
|
+ .onClick(()=>{
|
|
|
+ this.onSelectWorkHourRate(index)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('29%')
|
|
|
+ .height('100%')
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ .margin({left:'2%',right:'2%'})
|
|
|
+ Blank()
|
|
|
+ if(index > 0) {
|
|
|
+ Column(){
|
|
|
+ Image($r('app.media.process_delete_seq'))
|
|
|
+ .width($r('app.float.virtualSize_48'))
|
|
|
+ .height($r('app.float.virtualSize_48'))
|
|
|
+ .fillColor($r('app.color.FF453A'))
|
|
|
+ .margin({top:'35%'})
|
|
|
+ .onClick(()=>{
|
|
|
+ this.reporterList.splice(index,1)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('9%')
|
|
|
+ .alignItems(HorizontalAlign.Center)
|
|
|
+ .height('100%')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .height('100%')
|
|
|
+ .width('100%')
|
|
|
+ }
|
|
|
+ .height('40.7%')
|
|
|
+ .width('100%')
|
|
|
+ })
|
|
|
+ }
|
|
|
+ .width('100%')
|
|
|
+ .height('87%')
|
|
|
+ }
|
|
|
+ .height('48.6%')
|
|
|
+ .width('100%')
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ .width('96%')
|
|
|
+ .height('82.7%')
|
|
|
+
|
|
|
+ Column() {
|
|
|
+ Divider()
|
|
|
+ .vertical(false)
|
|
|
+ .strokeWidth(1)
|
|
|
+ .color($r('app.color.15FFFFFF'))
|
|
|
+ Row() {
|
|
|
+ Row() {
|
|
|
+ Text('取消')
|
|
|
+ .fontColor($r('app.color.60FFFFFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_30'))
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .width('50%')
|
|
|
+ .onClick(() => this.controller.close())
|
|
|
+ Divider()
|
|
|
+ .vertical(true)
|
|
|
+ .strokeWidth(1)
|
|
|
+ .color($r('app.color.15FFFFFF'))
|
|
|
+ Row() {
|
|
|
+ Text('确认报工')
|
|
|
+ .fontColor($r('app.color.007AFF'))
|
|
|
+ .fontSize($r('app.float.fontSize_30'))
|
|
|
+ }
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .width('50%')
|
|
|
+ .onClick(async () => {
|
|
|
+ if (!this.process || !this.process.id) {
|
|
|
+ promptAction.showToast({
|
|
|
+ message: '请先工序开工',
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let rateTotal = 0
|
|
|
+ for (const reporter of this.reporterList) {
|
|
|
+ if (!reporter.workingHoursRate) {
|
|
|
+ promptAction.showToast({
|
|
|
+ message: `请给${reporter.userName!}选择用时占比`,
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ rateTotal += reporter.workingHoursRate
|
|
|
+ }
|
|
|
+ if (rateTotal > 1) {
|
|
|
+ promptAction.showToast({
|
|
|
+ message: `用时占比超过100%,请修改`,
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ } else if (rateTotal < 1) {
|
|
|
+ promptAction.showToast({
|
|
|
+ message: `用时占比少于100%,请修改`,
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 报工
|
|
|
+ let seqNos: string [] = []
|
|
|
+ if (this.bindTaskSeq[0].reportSeqNos) {
|
|
|
+ seqNos = seqNos.concat(this.bindTaskSeq[0].reportSeqNos)
|
|
|
+ }
|
|
|
+ if (this.bindTaskSeq[0].defectSeqNos) {
|
|
|
+ seqNos = seqNos.concat(this.bindTaskSeq[0].defectSeqNos)
|
|
|
+ }
|
|
|
+ if (seqNos.length <= 0) {
|
|
|
+ promptAction.showToast({
|
|
|
+ message: `请选择报工流水号或者不良流水号`,
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ await ProcessRequest.post('/api/v1/process/info/reporting', {
|
|
|
+ processId: this.process.id!,
|
|
|
+ processUserReportList: this.reporterList,
|
|
|
+ seqList: seqNos
|
|
|
+ } as ProcessReportTimeBased)
|
|
|
+ this.clearSelectData()
|
|
|
+ this.controller.close();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .width('100%')
|
|
|
+ .height('7.3%')
|
|
|
+ }
|
|
|
+ .height('71%')
|
|
|
+ .width('62%')
|
|
|
+ .backgroundColor($r('app.color.2A2A2A'))
|
|
|
+ .justifyContent(FlexAlign.End)
|
|
|
+ .alignItems(HorizontalAlign.Center)
|
|
|
+ .borderRadius($r('app.float.virtualSize_16'))
|
|
|
+ }
|
|
|
+}
|