rev:新增老车间工单下发和打印功能

This commit is contained in:
2023-05-23 13:57:20 +08:00
parent 6ccc8bd551
commit 38feec1324
7 changed files with 408 additions and 168 deletions

View File

@@ -0,0 +1,48 @@
package org.nl.wms.mps.controller.oderExt;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.nl.common.anno.Log;
import org.nl.wms.mps.service.orderExt.IMpsSaleOrderIcExtService;
import org.nl.wms.mps.service.orderExt.dao.MpsSaleOrderIcExt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 生产订单扩展表 前端控制器
* </p>
*
* @author generator
* @since 2023-05-22
*/
@RestController
@RequestMapping("/api/mpsSaleOrderIcExt")
public class MpsSaleOrderIcExtController {
@Autowired
private IMpsSaleOrderIcExtService extService;
@PostMapping
@Log("新增订单扩展表")
@ApiOperation("新增订单扩展表")
public ResponseEntity<Object> create(@RequestBody JSONObject whereJson) {
extService.create(whereJson);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getExtList")
@Log("根据工单获取条码")
@ApiOperation("根据工单获取条码")
public ResponseEntity<Object> getExtList(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(extService.list(new QueryWrapper<MpsSaleOrderIcExt>().eq("remark1",whereJson.getString("workorder_code"))),HttpStatus.OK);
}
}

View File

@@ -27,6 +27,9 @@
<if test="query.shift_type_scode != null and query.shift_type_scode != ''"> <if test="query.shift_type_scode != null and query.shift_type_scode != ''">
and ShiftOrder.shift_type_scode = #{query.shift_type_scode} and ShiftOrder.shift_type_scode = #{query.shift_type_scode}
</if> </if>
<if test="query.workprocedure_code != null and query.workprocedure_code != ''">
and pro.workprocedure_code = #{query.workprocedure_code}
</if>
<if test="query.product_area != null and query.product_area != ''"> <if test="query.product_area != null and query.product_area != ''">
and ShiftOrder.product_area = #{query.product_area} and ShiftOrder.product_area = #{query.product_area}
</if> </if>

View File

@@ -20,6 +20,7 @@ public class WorkorderQuery extends BaseQuery<PdmProduceWorkorder> {
private String workorder_code; private String workorder_code;
private String material; private String material;
private String workorder_status; private String workorder_status;
private String workprocedure_code;
private String sale_id; private String sale_id;
private String shift_type_scode; private String shift_type_scode;
private String product_series; private String product_series;

View File

@@ -515,23 +515,25 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
throw new BadRequestException("已有工单选择该设备开工,请更换开工设备!"); throw new BadRequestException("已有工单选择该设备开工,请更换开工设备!");
} }
JSONArray array = new JSONArray(); JSONArray array = new JSONArray();
result = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
JSONObject order = packageForm(result); JSONObject order = packageForm(param);
array.add(order); array.add(order);
//下发acs //下发acs
result.setWorkorder_status(WorkerOrderEnum.PRODUCTING.getCode());
Map<String, Object> resp = wmsToAcsService.order(array); Map<String, Object> resp = wmsToAcsService.order(array);
PdmProduceWorkorder workOrder = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
workOrder.setWorkorder_status(WorkerOrderEnum.PRODUCTING.getCode());
if (((int) resp.get("status")) == (HttpStatus.BAD_REQUEST.value())) { if (((int) resp.get("status")) == (HttpStatus.BAD_REQUEST.value())) {
throw new BadRequestException(String.valueOf(resp.get("message"))); throw new BadRequestException(String.valueOf(resp.get("message")));
} }
this.update(result,new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id"))); this.update(workOrder, new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
this.recordWorkOrder(OptionRecord.OptionEnum.UPDATE, result.getWorkorder_id()); this.recordWorkOrder(OptionRecord.OptionEnum.UPDATE, result.getWorkorder_id());
return RestBusinessTemplate.execute(() -> resp); return RestBusinessTemplate.execute(() -> resp);
} }
@NotNull @NotNull
private JSONObject packageForm(PdmProduceWorkorder workOrder) { private JSONObject packageForm(JSONObject param) {
PdmProduceWorkorder workOrder = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
JSONObject form = new JSONObject(); JSONObject form = new JSONObject();
MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", workOrder.getMaterial_id())); MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", workOrder.getMaterial_id()));
PdmBiDevice device = deviceService.getOne(new QueryWrapper<PdmBiDevice>().eq("device_code", workOrder.getDevice_code())); PdmBiDevice device = deviceService.getOne(new QueryWrapper<PdmBiDevice>().eq("device_code", workOrder.getDevice_code()));
@@ -544,7 +546,10 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
form.put("material_code", material.getMaterial_code()); form.put("material_code", material.getMaterial_code());
form.put("material_spec", material.getMaterial_spec()); form.put("material_spec", material.getMaterial_spec());
form.put("device_code", workOrder.getDevice_code()); form.put("device_code", workOrder.getDevice_code());
form.put("is_needmove",workOrder.getIs_needmove()); form.put("is_needmove", workOrder.getIs_needmove() ? 1 : 0);
if (param.containsKey("extra_map")) {
form.put("extra_map", param.getJSONObject("extra_map"));
}
return form; return form;
} }

View File

@@ -6,50 +6,119 @@
:inline="true" :inline="true"
class="demo-form-inline" class="demo-form-inline"
label-position="right" label-position="right"
label-width="80px" label-width="120px"
label-suffix=":" label-suffix=":"
> >
<el-form-item label="所属库区"> <!--每箱袋数每袋数量箱数箱型目标巷道是否翻转托盘满托数量袋数-->
<el-cascader <el-row>
placeholder="所属库区" <el-col :span="6">
:options="sects" <el-form-item label="每箱袋数">
:props="{ checkStrictly: true }" <el-input-number
v-model="query.one_box_package_qty"
clearable clearable
class="filter-item" size="small"
@change="sectQueryChange" precision="0"
/> />
</el-form-item> </el-form-item>
<el-form-item label="锁定类型"> </el-col>
<el-select <el-col :span="6">
v-model="query.lock_type" <el-form-item label="每袋数量">
<el-input-number
v-model="query.one_package_qty"
clearable
precision="0"
size="small"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="托盘满托数量">
<el-input-number
v-model="query.tray_full_num"
clearable
size="small"
precision="0"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="箱型">
<el-input
v-model="query.box_type"
clearable clearable
size="mini" size="mini"
placeholder="锁定类型" placeholder="型"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="目标巷道">
<el-select
v-model="query.target_roadway"
clearable
size="mini"
placeholder="请选择"
class="filter-item" class="filter-item"
@change="crud.toQuery" style="width: 180px;"
@change="hand"
> >
<el-option <el-option
v-for="item in dict.d_lock_type" v-for="item in roadList"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否翻转">
<el-select
v-model="query.is_flip"
clearable
size="mini"
placeholder="请选择"
class="filter-item"
style="width: 180px;"
@change="hand"
>
<el-option
v-for="item in dict.IS_OR_NOT"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="模糊搜索">
<el-input
v-model="query.search"
clearable
size="mini"
placeholder="仓位编码、名称"
@keyup.enter.native="crud.toQuery"
/>
</el-form-item>
<rrOperation /> <rrOperation />
</el-row>
</el-form> </el-form>
</div> </div>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'--> <!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission" /> <crudOperation :permission="permission">
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-position"
size="mini"
:disabled="confirm_flag"
@click="startWork()"
>
开工
</el-button>
<el-button
slot="right"
class="filter-item"
type="success"
icon="el-icon-printer"
size="mini"
@click="print"
>
打印
</el-button>
</crudOperation>
<!--表单组件--> <!--表单组件-->
<el-dialog <el-dialog
@@ -197,51 +266,64 @@
size="mini" size="mini"
style="width: 100%;" style="width: 100%;"
@selection-change="crud.selectionChangeHandler" @selection-change="crud.selectionChangeHandler"
@current-change="handleCurrentChange"
@select="handleSelectionChange"
@select-all="onSelectAll"
> >
<!--
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
--> <el-table-column v-if="false" prop="workorder_id" label="生产班次工单标识" />
<el-table-column prop="struct_code" label="仓位编码" width="120" show-overflow-tooltip /> <el-table-column prop="workorder_code" label="工单编号" width="140px" />
<el-table-column prop="struct_name" label="仓位名称" width="150" show-overflow-tooltip /> <el-table-column prop="shift_type_scode" label="班次类型">
<el-table-column prop="simple_name" label="仓位简称" width="100" />
<el-table-column prop="sect_name" label="所属库区" width="150" />
<el-table-column prop="stor_name" label="所属仓库" width="150" />
<el-table-column prop="storagevehicle_code" label="载具号" min-width="120" show-overflow-tooltip />
<el-table-column prop="lock_type" label="锁定类型" min-width="120" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
{{ dict.label.d_lock_type[scope.row.lock_type] }} {{ dict.label.PDM_BI_SHIFTTYPE[scope.row.shift_type_scode] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="sect_name" label="库区名称" /> <!-- <el-table-column prop="workprocedure_code" label="工序编码" />-->
<el-table-column label="是否启用" align="center" prop="is_used"> <el-table-column prop="product_area" label="生产车间" />
<el-table-column prop="plan_qty" label="计划数量" />
<el-table-column prop="real_qty" label="实际数量" />
<el-table-column prop="person_name" label="生产人员" />
<el-table-column prop="person_real_qty" label="人员实际数量" width="100" show-overflow-tooltip />
<el-table-column prop="dq_real_qty" label="电气实际数量" width="100" show-overflow-tooltip />
<el-table-column prop="material_name" label="物料名称" width="120" show-overflow-tooltip />
<el-table-column prop="workprocedure_name" label="工序名称" width="120" show-overflow-tooltip />
<el-table-column prop="material_weight" label="物料单重" width="100" :formatter="crud.formatQlNum4" />
<el-table-column prop="planproducestart_date" label="计划开始时间" width="100" show-overflow-tooltip />
<el-table-column prop="planproduceend_date" label="计划结束时间" width="100" show-overflow-tooltip />
<el-table-column prop="realproducestart_date" label="实际开始时间" width="100" show-overflow-tooltip />
<el-table-column prop="realproduceend_date" label="实际结束时间" width="100" show-overflow-tooltip />
<el-table-column prop="device_code" label="当前设备编码" width="100" show-overflow-tooltip />
<el-table-column prop="is_canupdate_update" label="操作工是否允许修改报工数量" width="200" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch {{ dict.label.IS_OR_NOT[scope.row.is_canupdate_update] }}
:value="format_is_used(scope.row.is_used)"
active-color="#409EFF"
inactive-color="#F56C6C"
@change="changeEnabled(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="taskdtl_type" label="锁定任务类型" width="150" :formatter="taskdtl_typeFormat" /> <el-table-column prop="workorder_status" label="工单状态">
<el-table-column prop="task_code" label="锁定任务编码" width="150" />
<el-table-column prop="inv_code" label="锁定单据编码" width="150" />
<el-table-column prop="inv_type" label="锁定单据类型" width="150" :formatter="invtypeFormat" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
<el-table-column
v-permission="['admin','structattr:edit','structattr:del']"
label="操作"
fixed="right"
width="120px"
align="center"
>
<template slot-scope="scope"> <template slot-scope="scope">
<udOperation {{ dict.label.MPS_BD_ORDERSTATUS[scope.row.workorder_status] }}
:data="scope.row"
:permission="permission"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="is_needmove" label="是否搬运">
<template slot-scope="scope">
{{ dict.label.IS_OR_NOT[scope.row.is_needmove] }}
</template>
</el-table-column>
<el-table-column prop="create_type" label="创建类型" show-overflow-tooltip>
<template slot-scope="scope">
{{ dict.label.WORKORDER_CREATE_TYPE[scope.row.create_type] }}
</template>
</el-table-column>
<el-table-column prop="is_error" label="是否异常">
<template slot-scope="scope">
{{ dict.label.IS_OR_NOT[scope.row.is_error] }}
</template>
</el-table-column>
<el-table-column prop="error_info" label="异常信息" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" />
<el-table-column prop="create_name" label="创建人" show-overflow-tooltip />
<el-table-column prop="create_time" label="创建时间" show-overflow-tooltip />
<el-table-column prop="update_name" label="修改人" show-overflow-tooltip />
<el-table-column prop="update_time" label="修改时间" show-overflow-tooltip />
</el-table> </el-table>
<!--分页组件--> <!--分页组件-->
<pagination /> <pagination />
@@ -257,7 +339,9 @@ import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation' import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination' import pagination from '@crud/Pagination'
import crudSectattr from '@/api/wms/basedata/st/sectattr' import crudSectattr from '@/api/wms/basedata/st/sectattr'
/* import checkoutbill from "@/api/wms/st/core/outbill/checkoutbill";*/ import crudProduceshiftorder from '@/views/wms/product_manage/workorder/produceshiftorder'
import { getLodop } from '@/assets/js/lodop/LodopFuncs'
import orderExt from '@/views/wms/product_manage/workorder/orderExt'
const defaultForm = { const defaultForm = {
struct_id: null, struct_id: null,
@@ -306,14 +390,22 @@ const defaultForm = {
} }
export default { export default {
name: 'Structattr', name: 'Structattr',
dicts: ['ST_HEIGHT_TYPE', 'd_lock_type', 'SCH_TASK_TYPE_DTL'], dicts: ['ST_HEIGHT_TYPE', 'd_lock_type', 'SCH_TASK_TYPE_DTL', 'IS_OR_NOT', 'MPS_BD_ORDERSTATUS', 'WORKORDER_CREATE_TYPE', 'PDM_BI_SHIFTTYPE'],
components: { pagination, crudOperation, rrOperation, udOperation }, components: { pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(), header(), form(defaultForm), crud()], mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() { cruds() {
return CRUD({ return CRUD({
title: '仓位', title: '仓位',
optShow: { add: true, reset: true }, optShow: {
url: 'api/structattr', reset: true
},
query: {
workorder_status: '2',
product_area: 'A2',
workprocedure_code: 'BZ',
is_error: '0'
},
url: 'api/produceWorkorder',
idField: 'struct_id', idField: 'struct_id',
crudMethod: { ...crudStructattr } crudMethod: { ...crudStructattr }
}) })
@@ -334,7 +426,10 @@ export default {
} }
return { return {
sects: [], sects: [],
currentRow: null,
invtypelist: [], invtypelist: [],
roadList: ['1', '2', '3', '4', '5', '6', '7'],
confirm_flag: true,
permission: {}, permission: {},
rules: { rules: {
struct_id: [ struct_id: [
@@ -382,13 +477,11 @@ export default {
crudSectattr.getSect({}).then(res => { crudSectattr.getSect({}).then(res => {
this.sects = res.content this.sects = res.content
}) })
/* checkoutbill.getInvTypes().then(res => {
this.invtypelist = res
})*/
}, },
methods: { methods: {
// 钩子在获取表格数据之前执行false 则代表不获取数据 // 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() { [CRUD.HOOK.beforeRefresh]() {
this.currentRow = {}
return true return true
}, },
[CRUD.HOOK.afterToEdit](crud, form) { [CRUD.HOOK.afterToEdit](crud, form) {
@@ -397,6 +490,33 @@ export default {
val[1] = form.sect_id val[1] = form.sect_id
form.cascader = val form.cascader = val
}, },
handleSelectionChange(val, row) {
if (val.length > 1) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(val.pop())
this.buttonChange(row)
} else if (val.length === 1) {
this.buttonChange(row)
} else {
this.handleCurrentChange(null)
}
},
buttonChange(currentRow) {
if (currentRow !== null) {
this.currentRow = currentRow
this.confirm_flag = false
}
},
onSelectAll() {
this.$refs.table.clearSelection()
this.handleCurrentChange(null)
},
handleCurrentChange(currentRow) {
if (currentRow === null) {
this.confirm_flag = true
this.currentRow = {}
}
},
sectChange(val) { sectChange(val) {
this.form.sect_id = val[1] this.form.sect_id = val[1]
}, },
@@ -410,6 +530,23 @@ export default {
taskdtl_typeFormat(row) { taskdtl_typeFormat(row) {
return this.dict.label.SCH_TASK_TYPE_DTL[row.taskdtl_type] return this.dict.label.SCH_TASK_TYPE_DTL[row.taskdtl_type]
}, },
startWork() {
if (!this.crud.query.one_box_package_qty || !this.crud.query.one_package_qty || !this.crud.query.box_type ||
!this.crud.query.target_roadway || !this.crud.query.is_flip ||
!this.crud.query.tray_full_num) {
this.crud.notify('缺少开工必要参数,保证输入框内不能为空!', CRUD.NOTIFICATION_TYPE.INFO)
return
}
debugger
this.currentRow.extra_map = this.crud.query
this.currentRow.extra_map.package_qty = Math.ceil(this.currentRow.plan_qty / this.currentRow.extra_map.one_package_qty)
this.currentRow.extra_map.box_num = Math.ceil(this.currentRow.extra_map.package_qty / this.currentRow.extra_map.one_box_package_qty)
orderExt.add(this.currentRow).then(res => {
this.notify('操作成功', 'success')
})
crudProduceshiftorder.openStart(this.currentRow).then(res => {
})
},
sectQueryChange(val) { sectQueryChange(val) {
if (val.length === 1) { if (val.length === 1) {
this.query.stor_id = val[0] this.query.stor_id = val[0]
@@ -425,6 +562,33 @@ export default {
} }
this.crud.toQuery() this.crud.toQuery()
}, },
print() {
if (!this.currentRow) {
this.crud.notify('请选择一条工单记录进行打印', CRUD.NOTIFICATION_TYPE.INFO)
}
orderExt.getExtList(this.currentRow).then(res => {
debugger
const item = res[0]
// res.forEach((item) => {
const LODOP = getLodop()
LODOP.SET_SHOW_MODE('HIDE_DISBUTTIN_SETUP', 1)// 隐藏那些无效按钮
// 打印纸张大小设置https://www.it610.com/article/2094844.html
LODOP.SET_PRINT_PAGESIZE(1, '80mm', '50mm', '')
// LODOP.ADD_PRINT_RECT('0mm', '0mm', '48mm', '28mm', 0, 1)
LODOP.ADD_PRINT_BARCODE('10mm', '12mm', '60mm', '25mm', '128Auto', item.bar_code)
LODOP.SET_PRINT_STYLEA(0, 'ShowBarText', 0)
LODOP.ADD_PRINT_TEXT('35mm', '22mm', '40mm', '20mm', item.bar_code.substring(0, 9))
LODOP.SET_PRINT_STYLEA(0, 'FontSize', 20)
LODOP.ADD_PRINT_TEXT('42mm', '25mm', '40mm', '20mm', item.bar_code.substring(9, 16))
console.log(item.barcode)
LODOP.SET_PRINT_STYLEA(0, 'FontSize', 20)
// LODOP.PRINT()// 打印
// LODOP.PREVIEW()
})
// })
this.crud.notify('打印成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
},
// 改变状态 // 改变状态
format_is_used(is_used) { format_is_used(is_used) {
return is_used === true return is_used === true

View File

@@ -0,0 +1,19 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/mpsSaleOrderIcExt',
method: 'post',
data
})
}
export function getExtList(data) {
return request({
url: 'api/mpsSaleOrderIcExt/getExtList',
method: 'post',
data
})
}
export default { add, getExtList }

View File

@@ -65,7 +65,7 @@ export function getTable(data) {
export function openStart(data) { export function openStart(data) {
return request({ return request({
url: 'api/produceWorkorder/openStart', url: 'api/produceshiftorder/openStart',
method: 'post', method: 'post',
data data
}) })