bom完成

This commit is contained in:
DESKTOP-H2PAFLR\Administrator
2023-10-08 16:07:48 +08:00
parent f4af5818c8
commit 90238d7f74
7 changed files with 315 additions and 151 deletions

View File

@@ -1,7 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ZR.Admin.WebApi.Extensions;
using ZR.Model.mes.md;
using ZR.Service.mes.md;
using ZR.Service.MES.md;
using ZR.Service.MES.md.IService;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ZR.Admin.WebApi.Controllers.MES.md
{
@@ -29,5 +35,80 @@ namespace ZR.Admin.WebApi.Controllers.MES.md
return ToResponse(new ApiResult(200, "success", data));
}
/// <summary>
/// 查询父产品
/// </summary>
/// <param name="queryString">productCode码</param>
/// <returns></returns>
[HttpGet("queryBOM")]
public IActionResult List(string queryString="")
{
List<MdBom> data = mdBOMService.QueryBOM(queryString);
return ToResponse(new ApiResult(200, "success", data));
}
/// <summary>
/// 获取全部单位
/// </summary>
/// <returns></returns>
[HttpGet("getunitList")]
public IActionResult GetAllunitList()
{
List<MdUnit> data = mdBOMService.GetAllunitList();
return ToResponse(new ApiResult(200, "success", data));
}
/// <summary>
/// 新增BOM数据
/// </summary>
/// <param name="bom"></param>
/// <returns></returns>
[HttpPost("addBom")]
public IActionResult AddBOM([FromBody] MdBom bomItem)
{
if(bomItem!=null&&bomItem.Id!=null)
bomItem.ToCreate(HttpContext);
if (bomItem.ParentProductId == 0)
bomItem.ParentProductId = null;
int result=mdBOMService.AddBom(bomItem);
return ToResponse(new ApiResult(200, "success", result));
}
/// <summary>
/// 修改bom数据
/// </summary>
/// <param name="bomItem"></param>
/// <returns></returns>
[HttpPost("updateBom")]
public IActionResult UpdateBOM([FromBody] MdBom bomItem)
{
if (bomItem != null && bomItem.Id != null)
bomItem.ToUpdate(HttpContext);
if (bomItem.ParentProductId == 0)
bomItem.ParentProductId = null;
int result = mdBOMService.UpdateBOM(bomItem);
return ToResponse(new ApiResult(200, "success", result));
}
[HttpPost("delBom")]
public IActionResult deleteBOM([FromBody] List<int> ids)
{
if (ids != null)
{
int result = mdBOMService.deleteBOM(ids.ToArray());
return ToResponse(result);
}
return null;
}
}
}

View File

@@ -53,7 +53,7 @@ namespace ZR.Model.mes.md
[SugarColumn(ColumnName = "requireNum")]
public int? RequireNum { get; set; }
/// <summary>
/// 子项单位id
/// 单位id
///</summary>
[SugarColumn(ColumnName = "unit_id")]
public int? UnitId { get; set; }

View File

@@ -25,10 +25,10 @@
public string MeasureName { get; set; }
/// <summary>
/// 是否启用(不启用0,启用1
/// 是否启用(不启用N,启用Y
///</summary>
[SugarColumn(ColumnName = "enable_flag")]
public string EnableFlag { get; set; }
public char EnableFlag { get; set; }
/// <summary>
/// 备注

View File

@@ -1,4 +1,5 @@
using System;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -9,13 +10,16 @@ namespace ZR.Service.MES.md.IService
{
public interface IMdBOMService
{
int AddWorkline(MdBom workline);
int AddBom(MdBom bomItem);
public (int, List<MdBom>) GetAll(string productCode, string productName, int pageNum, int pageSize);
public int UpdateWorkline(MdBom workline);
public int UpdateBOM(MdBom mdBom);
public int deleteBOM(int[] ids);
public List<MdBom> QueryBOM(string queryString);
public List<MdUnit> GetAllunitList();
public int deleteWorkline(int[] ids);
}
}

View File

@@ -16,78 +16,84 @@ namespace ZR.Service.MES.md
{
[AppService(ServiceType = typeof(IMdBOMService), ServiceLifetime = LifeTime.Transient)]
public class MdBOMService : BaseService<MdWorkstation>, IMdBOMService
public class MdBOMService : BaseService<MdBom>, IMdBOMService
{
int IMdBOMService.AddWorkline(MdBom workline)
public int deleteBOM(int[] ids)
{
throw new NotImplementedException();
return Delete(ids);
}
int IMdBOMService.deleteWorkline(int[] ids)
public List<MdUnit> GetAllunitList()
{
throw new NotImplementedException();
return Context.Queryable<MdUnit>().Where(it=>it.EnableFlag=='Y').ToList();
}
public int UpdateBOM(MdBom mdBom)
{
return Context.Updateable(mdBom).WhereColumns(it => new {it.Id, it.ProductCode }).ExecuteCommand();
}
int IMdBOMService.AddBom(MdBom bom)
{
return Insert(bom);
}
(int, List<MdBom>) IMdBOMService.GetAll(string productCode, string productName, int pageNum, int pageSize)
{
int totalNum = 0;
if (string.IsNullOrEmpty(productCode) && string.IsNullOrEmpty(productName))
{
var data = Context.Queryable<MdBom>().ToPageList(pageNum, pageSize,ref totalNum);
List<MdBom> data = Context.Queryable<MdBom>().ToTree(it => it.Child, it => it.ParentProductId, null);
totalNum = data.Count();
data = data.Skip(pageSize * (pageNum - 1)).Take(pageSize).ToList();
return (totalNum, data);
}
else
{
//1. 查询本体
var predicate = Expressionable.Create<MdBom>()
.AndIF(!string.IsNullOrEmpty(productCode), it => it.ProductCode.Contains(productCode))
.AndIF(!string.IsNullOrEmpty(productName), it => it.ProductName.Contains(productName))
.ToExpression();
List<MdBom> data = Context.Queryable<MdBom>().Where(predicate).ToList();
.AndIF(!string.IsNullOrEmpty(productCode), it => it.ProductCode.Contains(productCode))
.AndIF(!string.IsNullOrEmpty(productName), it => it.ProductName.Contains(productName))
.And(it=>it.ParentProductId==null)
.ToExpression();
//2. 查询儿子
if (data != null & data.Count > 0)
List<MdBom> data = Context.Queryable<MdBom>().Where(predicate).ToList();
totalNum = data.Count();
List<MdBom> dataSons = new List<MdBom>();
if (data != null && data.Count > 0)
{
List<MdBom> data1 = new List<MdBom>();
List<MdBom> data2 = new List<MdBom>();
foreach (var item in data)
{
List<MdBom> dataItems = Context.Queryable<MdBom>().Where(it => it.ParentProductId == item.Id).ToList();
data1.AddRange(dataItems);
dataItems.Clear();
// 3. 查询孙子
if (data1 != null & data1.Count > 0)
{
foreach (var item1 in data1)
{
List<MdBom> dataItemss = Context.Queryable<MdBom>().Where(it1 => it1.ParentProductId == item1.Id).ToList();
data2.AddRange(dataItemss);
dataItemss.Clear();
}
}
List<MdBom> data1 = Context.Queryable<MdBom>().ToTree(it => it.Child, it => it.ParentProductId, item.Id);
item.Child=data1;
}
data.AddRange(data1);
data.AddRange(data2);
}
return (data.Count(),data);
data = data.Skip(pageSize * (pageNum - 1)).Take(pageSize).ToList();
return (totalNum, data);
}
}
int IMdBOMService.UpdateWorkline(MdBom workline)
List<MdBom> IMdBOMService.QueryBOM(string queryString)
{
throw new NotImplementedException();
var predicate = Expressionable.Create<MdBom>()
.AndIF(!string.IsNullOrEmpty(queryString), it => it.ProductCode.Contains(queryString))
.ToExpression();
return Context.Queryable<MdBom>().Where(predicate).ToList();
}
}
}

View File

@@ -9,7 +9,15 @@ export function getBomList(query) {
})
}
export function insertBom(data) {
export function getBOMQuery(query) {
return request({
url: '/mes/md/bom/queryBOM',
method: 'get',
params: query,
})
}
export function insertbom(data) {
return request({
url: '/mes/md/Bom/addBom',
method: 'post',
@@ -19,7 +27,7 @@ export function insertBom(data) {
}
export function updateBom(data) {
export function updatebom(data) {
return request({
url: '/mes/md/Bom/updateBom',
method: 'post',
@@ -29,7 +37,7 @@ export function updateBom(data) {
}
export function delBom(data) {
export function delbom(data) {
return request({
url: '/mes/md/Bom/delBom',
method: 'post',
@@ -38,11 +46,11 @@ export function delBom(data) {
})
}
export function getWorkshopList(query) {
export function getunitList(query) {
return request({
url: '/mes/md/Bom/getWorkshopList',
url: '/mes/md/Bom/getunitList',
method: 'get',
params: query,
})
}
}

View File

@@ -13,13 +13,19 @@
</el-form>
</div>
<div>
<!-- <el-table
<el-row :gutter="2">
<el-col :span="1.5">
<el-button type="primary" size="small" @click="addItem">新增</el-button>
</el-col>
<right-toolbar :showSearch.sync="search.showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
:data="table.bomList"
style="width: 100%; margin-bottom: 20px"
row-key="id"
border
default-expand-all
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
:tree-props="{ children: 'child', hasChildren: 'hasChildren' }"
>
<el-table-column prop="productCode" label="产品编码" sortable width="180"> </el-table-column>
<el-table-column prop="productName" label="产品名称" sortable> </el-table-column>
@@ -27,33 +33,15 @@
<el-table-column prop="productPosition" label="来源"> </el-table-column>
<el-table-column prop="requireNum" label="需求数量"> </el-table-column>
<el-table-column prop="unitId" label="单位"> </el-table-column>
</el-table> -->
<vxe-table
border
align="center"
:print-config="{}"
ref="xTable1"
:data="table.bomList"
:loading="table.loading"
@checkbox-change="selectChangeEvent"
:row-config="{ isHover: true }"
:tree-config="{ transform: true, rowField: 'id', parentField: 'parentProductId' }"
>
<vxe-column field="productCode" title="产品编码" tree-node></vxe-column>
<vxe-column field="productName" title="产品名称"></vxe-column>
<vxe-column field="productType" title="零件类型"></vxe-column>
<vxe-column field="productPosition" title="来源"></vxe-column>
<vxe-column field="requireNum" title="需求数量"></vxe-column>
<vxe-column field="unitId" title="单位"></vxe-column>
<vxe-column title="操作" show-overflow>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="updataItem(false, scope.row)">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="deleteItem(false, scope.row)" class="delred">删除</el-button>
<el-button size="mini" @click="updataItem(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="deleteItem(scope.$index, scope.row)">删除</el-button>
</template>
</vxe-column>
</vxe-table>
</el-table-column>
</el-table>
<vxe-pager
background
:current-page.sync="pagination.pageNum"
@@ -68,23 +56,52 @@
<!-- 弹窗-- 修改和删除 -->
<el-dialog :title="DMLdialog.title" :visible.sync="DMLdialog.visiable" width="600px" append-to-body>
<el-form ref="DMLdialog" :model="DMLdialog.form" label-width="150px" label-position="left" :rules="DMLdialog.rules">
<el-form-item label="线体编码 " prop="lineCode">
<el-input v-model="DMLdialog.form.lineCode" placeholder="输入线体编码"></el-input>
</el-form-item>
<el-form-item label="线体名称 " prop="lineName">
<el-input v-model="DMLdialog.form.lineName" placeholder="输入线体名称"></el-input>
</el-form-item>
<el-form-item label="车间 " prop="pkWorkshopName">
<el-select v-model="DMLdialog.form.fkWorkShopId" placeholder="请选择车间">
<el-form-item label="父级产品code " prop="parentProductId" id="test">
<el-select
id="autocomplete"
v-model="DMLdialog.form.parentProductId"
filterable
remote
clear
placeholder="请输入父级产品"
:remote-method="ParentProduct_querySearchAsync"
:loading="DMLdialog.loading"
>
<el-option label="无" :value="0"></el-option>
<el-option
v-for="item in DMLdialog.workshopOption"
v-for="item in DMLdialog.ParentProductOptions"
:key="item.id"
:label="item.id + '_' + item.workshopId + '_' + item.workshopName"
:label="item.productCode + '|' + item.productName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="产品编码 " prop="productCode">
<el-input v-model="DMLdialog.form.productCode" placeholder="输入产品编码" :disabled="DMLdialog.isUpdate"></el-input>
</el-form-item>
<el-form-item label="产品名称 " prop="productName">
<el-input v-model="DMLdialog.form.productName" placeholder="输入产品名称"></el-input>
</el-form-item>
<el-form-item label="安全库存 " prop="safetyStock">
<el-input v-model="DMLdialog.form.safetyStock" placeholder="输入产品安全库存" type="Number"></el-input>
</el-form-item>
<el-form-item label="位置 " prop="productPosition">
<el-input v-model="DMLdialog.form.productPosition" placeholder="输入安全位置"></el-input>
</el-form-item>
<el-form-item label="需求数量 " prop="requireNum">
<el-input v-model="DMLdialog.form.requireNum" placeholder="输入需求数量" type="Number"></el-input>
</el-form-item>
<el-form-item label="数量单位 " prop="unitId">
<el-select v-model="DMLdialog.form.unitId" placeholder="选择需求数量单位">
<el-option v-for="item in DMLdialog.unitList" :key="item.id" :label="item.measureCode" :value="item.measureId"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@@ -95,7 +112,7 @@
</template>
<script>
import { getBomList, insertbom, updatebom, delbom, getWorkshopList } from '@/api/basisManagement/bom.js'
import { getBomList, getBOMQuery, insertbom, updatebom, delbom, getunitList } from '@/api/basisManagement/bom.js'
export default {
name: 'bom',
data() {
@@ -122,15 +139,23 @@ export default {
title: '',
visiable: false,
form: {
lineCode: '',
lineName: '',
fkWorkShopId: '',
productCode: '',
productName: '',
productType: '',
safetyStock: 1000,
productPosition: '',
requireNum: 1000,
unitId: null,
parentProductId: '',
},
workshopOption: [],
unitList: [],
rules: {
lineCode: [{ required: true, message: '线体编码不能为空', trigger: 'blur' }],
lineName: [{ required: true, message: '线体名称不能为空', trigger: 'blur' }],
productCode: [{ required: true, message: '产品编码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
},
loading: false,
ParentProductOptions: [], //父产品列表
isUpdate: false, // 更新时产品code不可修改
},
//修改按钮
updateDisable: true,
@@ -139,8 +164,10 @@ export default {
flag: 'update', //区分修改和删除
}
},
created() {
mounted() {
this.getList()
this.getUnitOptionList()
this.ParentProduct_querySearchAsync('')
},
methods: {
//获取表格数据
@@ -191,20 +218,27 @@ export default {
updatebom(this.DMLdialog.form).then((res) => {
if (res.code == 200 && res.data == 1) {
this.$notify.success('修改成功')
this.getList()
this.DMLdialog.visiable = false
this.reset()
} else {
this.$notify.error('修改失败')
}
this.getList()
this.reset()
this.DMLdialog.isUpdate = false
})
} else if (this.flag == 'add') {
this.$refs['DMLdialog'].validate((valid) => {
if (valid) {
insertbom(this.DMLdialog.form).then((res) => {
if (res.code == 200) {
this.getList()
this.DMLdialog.visiable = false
this.reset()
if (res.code == 200 && res.data == 1) {
this.$notify.success('新增成功')
} else {
this.$notify.error('新增失败')
}
this.getList()
this.DMLdialog.visiable = false
this.reset()
})
}
})
@@ -213,65 +247,88 @@ export default {
cancel() {
this.DMLdialog.visiable = false
this.reset()
this.DMLdialog.isUpdate = false
},
reset() {
this.DMLdialog.form = {
lineCode: '',
lineName: '',
productCode: '',
productName: '',
productType: '',
safetyStock: 1000,
productPosition: '',
requireNum: 1000,
unitId: null,
parentProductId: '',
}
this.DMLdialog.form.reset()
this.resetForm('DMLdialog')
},
//修改事件
updataItem(flag, row) {
updataItem(index, row) {
console.log(row)
this.DMLdialog.title = '修改'
this.DMLdialog.visiable = true
this.flag = 'update'
if (!flag) {
this.DMLdialog.form.lineCode = row.lineCode
this.DMLdialog.form.lineName = row.lineName
this.DMLdialog.form.id = row.id
this.DMLdialog.form.fkWorkShopId = row.fkWorkShopId
} else {
const records = this.$refs.xTable1.getCheckboxRecords()
if (records.length == 1) {
this.DMLdialog.form.lineCode = records[0].lineCode
this.DMLdialog.form.lineName = records[0].lineName
this.DMLdialog.form.id = records[0].id
this.DMLdialog.form.fkWorkShopId = records[0].fkWorkShopId
}
}
this.DMLdialog.isUpdate = true
this.DMLdialog.form.productCode = row.productCode
this.DMLdialog.form.productName = row.productName
this.DMLdialog.form.productType = row.productType
this.DMLdialog.form.safetyStock = row.safetyStock
this.DMLdialog.form.productPosition = row.productPosition
this.DMLdialog.form.requireNum = row.requireNum
this.DMLdialog.form.unitId = row.unitId
this.DMLdialog.form.parentProductId = row.parentProductId
},
//删除事件
deleteItem(flag, row) {
if (!flag) {
this.$modal
.confirm('是否确认删除线体名称为"' + row.lineName + '"的数据项?')
.then(function () {
const array = []
array.push(row.id)
return delbom(array)
})
.then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
})
.catch(() => {})
} else {
const records = this.$refs.xTable1.getCheckboxRecords()
if (records.length > 0) {
this.$modal
.confirm('是否确认删除线体名称为"' + records.map((it) => it.lineName) + '"的数据项?')
.then(function () {
return delbom(records.map((it) => it.id))
deleteItem(index, row) {
this.$modal
.confirm('是否确认删除产品名称为"' + row.productName + '"的数据项?')
.then(function () {
const array = []
array.push(row.id)
return delbom(array)
})
.then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
})
.catch(() => {})
},
// 父级产品远程搜索
ParentProduct_querySearchAsync(queryString) {
debugger
if (queryString != '') this.DMLdialog.loading = true
getBOMQuery({ queryString: queryString }).then((res) => {
if (res.code == 200) {
this.DMLdialog.loading = false
const result = []
if (res.data.length > 0) {
res.data.forEach((element) => {
result.push({ id: element.id, productCode: element.productCode, productName: element.productName })
})
.then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
})
.catch(() => {})
}
this.DMLdialog.ParentProductOptions = result
}
}
})
},
// 获取 unit
getUnitOptionList() {
getunitList().then((res) => {
if (res.code == 200) {
const result = []
res.data.forEach((item, index) => {
result.push({
id: index,
measureId: item.measureId,
measureCode: item.measureCode,
})
})
this.DMLdialog.unitList = result
} else {
this.$notify.warning('code:' + res.code)
}
})
},
},
}
@@ -287,4 +344,12 @@ export default {
color: #f56c6c;
}
}
#test {
::v-deep .el-autocomplete {
width: 100%;
}
}
::v-deep .el-select {
width: 100%;
}
</style>