Browse Source

添加工艺生成标签的映射值,添加关包、内部工单进包的逻辑

pull/89/head
zhangxin 3 years ago
parent
commit
74d7ebcfb0
7 changed files with 350 additions and 32 deletions
  1. +4
    -4
      models/pln/pln.go
  2. +39
    -6
      services/jit/PackOrder.service.go
  3. +202
    -14
      services/jit/implments/PackOrder.service.impl.go
  4. +4
    -2
      services/om/implments/SerialOrder.service.impl.go
  5. +49
    -3
      services/pln/implments/CustOrder.service.impl.go
  6. +48
    -3
      web/controllers/jit/PackOrder.rest.go
  7. +4
    -0
      web/controllers/jit/jit.go

+ 4
- 4
models/pln/pln.go View File

@ -2,13 +2,13 @@ package pln
// CustOrderWithStatus 客户订单和状态联查
type CustOrderWithStatus struct {
CustOrder `xorm:"extends"`
CustOrder `xorm:"extends"`
CustOrderStatus `xorm:"extends"`
}
// CustOrderData 客户订单和状态、数量的联查
type CustOrderData struct {
CustOrder `xorm:"extends"`
CustOrder `xorm:"extends"`
CustOrderStatus `xorm:"extends"`
CustOrderQty `xorm:"extends"`
}
CustOrderQty `xorm:"extends"`
}

+ 39
- 6
services/jit/PackOrder.service.go View File

@ -227,18 +227,14 @@ type PackOrderService interface {
*
* @Function Parameters : 包装单ID
*
* @Function Parameters : 包装模板ID
*
* @Return Value : *model.PackOrderInfo
*
* @Return Value : 执行时发生的错误
*
* @Author : zhangxin
*
* @Date : 2021-10-22
* @Date : 2021-12-16
*
******************************************************************************/
//ClosePackOrder(user *global.User, packOrderId string, templateId string) error
ClosePackOrder(user *global.User, packOrderId string) error
/******************************************************************************
*
@ -259,6 +255,43 @@ type PackOrderService interface {
*
******************************************************************************/
SplitPackOrder(user *global.User, packOrderId string) error
/******************************************************************************
*
* @Function Name : SplitPackOrderBySerialOrderId
*-----------------------------------------------------------------------------
*
* @Description : 通过工单ID进行拆包
*
* @Function Parameters : 当前访问人员信息
*
* @Function Parameters : 工单ID
*
* @Return Value : 执行时发生的错误
*
* @Author : zhangxin
*
* @Date : 2021-12-16
*
******************************************************************************/
SplitPackOrderBySerialOrderId(user *global.User, serialOrderId string) error
/******************************************************************************
*
* @Function Name : GetUserOperatePackOrder
*-----------------------------------------------------------------------------
*
* @Description : 获取用户当前操作的包装单
*
* @Function Parameters : 当前访问人员信息
*
* @Return Value : 包装单ID
*
* @Return Value : 执行时发生的错误
*
* @Author : zhangxin
*
* @Date : 2021-12-16
*
******************************************************************************/
GetUserOperatePackOrder(user *global.User) (string, error)
}


+ 202
- 14
services/jit/implments/PackOrder.service.impl.go View File

@ -378,7 +378,6 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
return nil, grmi.NewBusinessError("初始化全局包装模板失败, error:" + err.Error())
}
}
//判断条码是否已经生成过包装
dataList, err := packLstDAO.Select([]grmi.Predicate{
meta.PackOrderItemLst_SerialOrderId.NewPredicate(grmi.Equal, barcode),
@ -403,18 +402,7 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
if serialOrderLi[0].SerialOrderStatus.Status != baseModel.WO_STATUS_FINISHED {
return nil, grmi.NewBusinessError("条码对应的工单状态不是已完成")
}
// 台套Key
syncKey := serialOrderLi[0].SyncKey
// 通过工单条码获取总成
artId := serialOrderLi[0].ArtId
projectId := serialOrderLi[0].ProjectId
project, err := projectDao.SelectOne(projectId)
if err != nil {
return nil, grmi.NewBusinessError("查询车型项目数据失败, error:" + err.Error())
}
if project == nil {
return nil, grmi.NewBusinessError("车型项目数据不存在,项目ID:" + projectId)
}
serialOrder := serialOrderLi[0]
// 获取用户之前是否存在未关包的包装单 如果存在则使用之前的包装单ID 如果不存在则创建包装单 如果超过一个则报错
var packOrderId string
packOrderLi, err := packOrderDao.SelectUserRunningPackOrder(user.UserId)
@ -428,12 +416,32 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
} else {
return nil, grmi.NewBusinessError("该用户现在存在多个包装中的包装单, 请确认")
}
// 通过工单条码获取总成
artId := serialOrderLi[0].ArtId
projectId := serialOrderLi[0].ProjectId
project, err := projectDao.SelectOne(projectId)
if err != nil {
return nil, grmi.NewBusinessError("查询车型项目数据失败, error:" + err.Error())
}
if project == nil {
return nil, grmi.NewBusinessError("车型项目数据不存在,项目ID:" + projectId)
}
// 台套Key
syncKey := serialOrderLi[0].SyncKey
if err := session.Begin(); err != nil {
return nil, grmi.NewBusinessError("事务开启失败, error:" + err.Error())
}
currentPackOrder := &model.PackOrderWithStatus{}
// 如果当前用户不存在操作中未关闭的包装单, 则创建包装单数据
if packOrderId == "" {
var packTypeId string
if serialOrder.OrderType == baseModel.ODER_TYPE_INTERVAL {
packTypeId = model.PACK_TYPE_INT
} else {
packTypeId = model.PACK_TYPE_STD
}
packOrderId, err = snrDao.GetNextSnr(project.PackOrderSnr)
if err != nil {
_ = session.Rollback()
@ -444,6 +452,7 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
ProjectId: projectId,
PlanQty: 1,
ActQty: 1,
PackTypeId: packTypeId,
OpenTime: grmi.DateTime(time.Now()),
Operator: user.UserId,
}
@ -492,6 +501,43 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
_ = session.Rollback()
return nil, grmi.NewBusinessError("对应的包装单数据不存在, 包装单ID:" + packOrderId)
}
// 如果工单时内部工单 则校验包装单类型 是不是符合要求 同时插入包装单
if serialOrder.OrderType == baseModel.ODER_TYPE_INTERVAL {
if currentPackOrder.PackOrder.PackTypeId != model.PACK_TYPE_INT {
_ = session.Rollback()
return nil, grmi.NewBusinessError("当前进行包装的包装单是标包类型, 但工单是内部工单")
}
currentPackOrder.PackOrder.ActQty += 1
currentPackOrder.PackOrder.PlanQty += 1
currentPackOrder.PackOrder.Operator = user.UserId
err = packOrderDao.UpdateOne(&currentPackOrder.PackOrder)
if err != nil {
_ = session.Rollback()
return nil, grmi.NewBusinessError("更新包装单数据失败, error:" + err.Error())
}
// 写入当前扫描的包装单子项
packOrderLst := model.PackOrderItemLst{
PackOrderId: packOrderId,
Pos: 1,
PartId: artId,
SerialOrderId: barcode,
Status: model.PACK_STATUS_CLOSED,
PlanQty: 1,
ActQty: 1,
}
err = packLstDAO.InsertOne(&packOrderLst)
if err != nil {
_ = session.Rollback()
return nil, grmi.NewBusinessError("插入包装单细则失败, error:" + err.Error())
}
_ = session.Commit()
result.IsClosed = false
result.Message = "扫描完成, 包装单ID:" + currentPackOrder.PackOrder.PackOrderId
result.PackOrderId = currentPackOrder.PackOrder.PackOrderId
result.MatchTemplateLi = make([]model.PackTemplate, 0)
return result, nil
}
// 判断包装单是否校验CheckSyncKey
if currentPackOrder.PackOrder.CheckSyncKey {
packLstLi, err := packLstDAO.Select([]grmi.Predicate{meta.PackOrderItemLst_PackOrderId.NewPredicate(grmi.Equal, packOrderId)}, nil)
@ -949,6 +995,69 @@ func (impl *PackOrderServiceImplement) ScanBarcode(user *global.User, barcode st
// return nil
//}
// ClosePackOrder 关闭包装单
func (impl *PackOrderServiceImplement) ClosePackOrder(user *global.User, packOrderId string) error {
grmi.Log(user, "/services/jit/implments/PackOrder.service.impl.go", "ClosePackOrder", "关闭包装单")
engine := db.Eloquent.Master()
session := engine.NewSession()
defer session.Close()
var err error
dao := dal.NewPackOrderDAO(session, user.PlantNr, user.UserId)
statusDao := dal.NewPackOrderStatusDAO(session, user.PlantNr, user.UserId)
statusHistoryDao := dal.NewPackOrderStatusHistoryDAO(session, user.PlantNr, user.UserId)
packOrder, err := dao.SelectOne(packOrderId)
if err != nil {
return grmi.NewBusinessError("查询包装单失败, error:" + err.Error())
}
if packOrder == nil {
return grmi.NewBusinessError("不存在该包装单, 包装单Id:" + packOrderId)
}
if packOrder.PackTypeId != model.PACK_TYPE_INT {
return grmi.NewBusinessError("不是内部包装单,不允许手动关包")
}
packOrderStatus, err := statusDao.SelectOne(packOrderId)
if err != nil {
return grmi.NewBusinessError("查询包装单状态失败, error:" + err.Error())
}
if packOrderStatus == nil {
return grmi.NewBusinessError("未查询到包装单状态")
}
if packOrderStatus.Status != model.PACK_STATUS_RUNNING {
return grmi.NewBusinessError("包状态状态不是包装中, 不能关包")
}
if err := session.Begin(); err != nil {
return err
}
maxPos, err := statusHistoryDao.GetMaxPos(packOrderId)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("获取包装单状态变更历史位置数据失败, error:" + err.Error())
}
statusHistory := model.PackOrderStatusHistory{
PackOrderId: packOrderId,
Pos: maxPos+1,
StatusChangeType: model.PACK_STATUS_CHANGE_TYPE_PACK,
FromStatus: model.PACK_STATUS_RUNNING,
ToStatus: model.PACK_STATUS_CLOSED,
ChangeTime: grmi.DateTime(time.Now()),
}
err = statusHistoryDao.InsertOne(&statusHistory)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("写入包装单状态变更历史失败, error:" + err.Error())
}
packOrderStatus.Status = model.PACK_STATUS_CLOSED
err = statusDao.UpdateOne(packOrderStatus)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("更新包装单状态失败, error:" + err.Error())
}
_ = session.Commit()
return nil
}
// CreateByTemplate 通过模板创建包装单
func (impl *PackOrderServiceImplement) CreateByTemplate(user *global.User, packTemplateId string) (err error) {
grmi.Log(user, "/services/jit/implments/PackOrder.service.impl.go", "CreateByTemplate", "通过包装模板创建包装单")
@ -1116,9 +1225,88 @@ func (impl *PackOrderServiceImplement) SplitPackOrder(user *global.User, packOrd
return nil
}
// SplitPackOrderBySerialOrderId 通过工单ID进行拆包
func (impl *PackOrderServiceImplement) SplitPackOrderBySerialOrderId(user *global.User, serialOrderId string) error {
grmi.Log(user, "/services/jit/implments/PackOrder.service.impl.go", "SplitPackOrderBySerialOrderId", "拆包")
engine := db.Eloquent.Master()
session := engine.NewSession()
defer session.Close()
packOrderDao := dal.NewPackOrderDAO(session, user.PlantNr, user.UserId)
packOrderItemDao := dal.NewPackOrderItemLstDAO(session, user.PlantNr, user.UserId)
packOrderStatusDao := dal.NewPackOrderStatusDAO(session, user.PlantNr, user.UserId)
packOrderStatusHistoryDao := dal.NewPackOrderStatusHistoryDAO(session, user.PlantNr, user.UserId)
// 通过工单ID查询包装单
packItemLi, err := packOrderItemDao.Select([]grmi.Predicate{meta.PackOrderItemLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrderId),
meta.PackOrderItemLst_Status.NewPredicate(grmi.Equal, model.PACK_STATUS_CLOSED)}, nil)
if len(packItemLi) == 0 {
return grmi.NewBusinessError("该工单未进行包")
}
packOrderId := packItemLi[0].PackOrderId
// 校验包装单
packOrder, err := packOrderDao.SelectOneWithStatus(packOrderId)
if err != nil {
return grmi.NewBusinessError("查询包装单数据失败, error:" + err.Error())
}
if packOrder == nil {
return grmi.NewBusinessError("不存在对应的包装单, 包装单ID:" + packOrderId)
}
if packOrder.PackOrderStatus.LoadStatus == model.SHIP_STATUS_CLOSED || packOrder.PackOrderStatus.ShipStatus == model.SHIP_STATUS_CLOSED {
return grmi.NewBusinessError("该包装单已在发运中或已发运,不允许拆包")
}
//开启事务
if err = session.Begin(); err != nil {
return err
}
// 更新包装单操作人员
packOrder.PackOrder.Operator = user.UserId
packOrder.PackOrder.CloseTime = grmi.DateTime(time.Now())
err = packOrderDao.UpdateOne(&packOrder.PackOrder)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("更新包装单数据失败, error:" + err.Error())
}
// 更新包状态状态 及写入变更记录
maxPos, err := packOrderStatusHistoryDao.GetMaxPos(packOrderId)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("查询包装单状态变更位置失败, error:" + err.Error())
}
packOrderStatusHistory := model.PackOrderStatusHistory{
PackOrderId: packOrderId,
Pos: maxPos + 1,
StatusChangeType: model.PACK_STATUS_CHANGE_TYPE_PACK,
FromStatus: packOrder.PackOrderStatus.Status,
ToStatus: model.PACK_STATUS_CANCELED,
ChangeTime: grmi.DateTime(time.Now()),
}
err = packOrderStatusHistoryDao.InsertOne(&packOrderStatusHistory)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("保存包装单状态变更记录失败, error:" + err.Error())
}
packOrder.PackOrderStatus.Status = model.PACK_STATUS_CANCELED
err = packOrderStatusDao.UpdateOne(&packOrder.PackOrderStatus)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("更新包装单状态失败, error:" + err.Error())
}
// 更新包装单子项状态
updatePackOrderItem := model.PackOrderItemLst{
Status: model.PACK_STATUS_CANCELED,
}
err = packOrderItemDao.UpdateWhere([]grmi.Predicate{meta.PackOrderItemLst_PackOrderId.NewPredicate(grmi.Equal, packOrderId)}, &updatePackOrderItem, []string{meta.PackOrderItemLst_Status.Name}...)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("更新包状态子项状态失败, error:" + err.Error())
}
_ = session.Commit()
return nil
}
// GetUserOperatePackOrder 获取当前用户操作的包装单
func (impl *PackOrderServiceImplement) GetUserOperatePackOrder(user *global.User) (string, error) {
grmi.Log(user, "/services/jit/implments/PackOrder.service.impl.go", "SplitPackOrder", "拆包")
grmi.Log(user, "/services/jit/implments/PackOrder.service.impl.go", "GetUserOperatePackOrder", "获取当前用户操作的包装单")
engine := db.Eloquent.Master()
session := engine.NewSession()
defer session.Close()


+ 4
- 2
services/om/implments/SerialOrder.service.impl.go View File

@ -1251,7 +1251,6 @@ func (impl *SerialOrderServiceImplement) PrintRuleInfo(user *global.User, sessio
labelHeadDao := baseDal.NewLabelHeadDAO(session, user.PlantNr, user.UserId)
labelDetailDao := baseDal.NewLabelDetailDAO(session, user.PlantNr, user.UserId)
serialOrderDetailDao := dal.NewSerialOrderOPDetailDAO(session, user.PlantNr, user.UserId)
// 生成打印规则
op := model.SerialOrderOPDetail{
SerialOrderId: serialOrderStep.SerialOrderId,
@ -1338,11 +1337,14 @@ func (impl *SerialOrderServiceImplement) PrintRuleInfo(user *global.User, sessio
}
pos++
case "$ArtId$":
if len(article.ArtId) < 7 {
continue
}
labelDetail = baseModel.LabelDetail{
LabelId: labelId,
Pos: pos,
VariableName: templateDetail.LabelItemValue,
VariableValue: article.ArtId,
VariableValue: article.ArtId[:7],
}
pos++
case "$CustArtId$":


+ 49
- 3
services/pln/implments/CustOrder.service.impl.go View File

@ -151,17 +151,63 @@ func (impl *CustOrderServiceImplement) InsertOne(user *global.User, entity *mode
session := engine.NewSession()
defer session.Close()
dao := dal.NewCustOrderDAO(session, user.PlantNr, user.UserId)
record, err := dao.SelectOne(entity.CustOrderId)
snrDao := baseDal.NewSnrDAO(session, user.PlantNr, user.UserId)
projectDao := meDal.NewProjectDAO(session, user.PlantNr, user.UserId)
qtyDao := dal.NewCustOrderQtyDAO(session, user.PlantNr, user.UserId)
statusDao := dal.NewCustOrderStatusDAO(session, user.PlantNr, user.UserId)
if entity.PlanQty == 0 {
return grmi.NewBusinessError("创建客户订单计划生产数量为0")
}
if entity.ProductFamilyId == "" || entity.ProjectId == "" {
return grmi.NewBusinessError("工单数据缺失")
}
productFamilyDao := meDal.NewProductFamilyDAO(session, user.PlantNr, user.UserId)
productFamily, err := productFamilyDao.SelectOne(entity.ProductFamilyId)
if err != nil {
return grmi.NewBusinessError("查询车型配置失败, error:" + err.Error())
}
if productFamily == nil {
return grmi.NewBusinessError("不存在订单指定的车型配置,车型配置ID:" + entity.ProductFamilyId)
}
project, err := projectDao.SelectOne(entity.ProjectId)
if err != nil {
return grmi.NewBusinessError("查询车型项目失败, error:" + err.Error())
}
if project == nil {
return grmi.NewBusinessError("不存在对应的车型项目, 车型项目ID:" + entity.ProjectId)
}
if err = session.Begin(); err != nil {
return err
}
if record != nil {
return grmi.NewBusinessError("已经存在相同主键的记录!")
custOrderId, err := snrDao.GetNextSnr(entity.ProjectId)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("生成客户订单流水号失败, error:" + custOrderId)
}
custOrderQty := model.CustOrderQty{
CustOrderId: custOrderId,
PlantNr: entity.PlanQty,
}
err = qtyDao.InsertOne(&custOrderQty)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("写入客户订单数量失败, error:" + err.Error())
}
custOrderStatus := model.CustOrderStatus{
CustOrderId: custOrderId,
Status: baseModel.WO_STATUS_UNPLANNED,
}
err = statusDao.InsertOne(&custOrderStatus)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("写入客户订单状态数据失败, error:" + err.Error())
}
err = dao.InsertOne(entity)
if err != nil {
_ = session.Rollback()
return err
}
_ = session.Commit()
return nil
}


+ 48
- 3
web/controllers/jit/PackOrder.rest.go View File

@ -452,7 +452,7 @@ func RegisterScanBarcode(party router.Party, path string, method func(user *glob
* @Date : 2021-10-22
*
******************************************************************************/
func RegisterClosePackOrder(party router.Party, path string, method func(user *global.User, packOrderId string, templateId string) error) {
func RegisterClosePackOrder(party router.Party, path string, method func(user *global.User, packOrderId string) error) {
party.Get(path, func(ctx iris.Context) {
user, ok := jwts.ParseToken(ctx)
@ -461,7 +461,6 @@ func RegisterClosePackOrder(party router.Party, path string, method func(user *g
}
type ClosePackOrderData struct {
PackOrderId string `json:"packOrderId"`
TemplateId string `json:"templateId"`
}
var data ClosePackOrderData
if err := ctx.ReadJSON(&data); err != nil {
@ -472,7 +471,7 @@ func RegisterClosePackOrder(party router.Party, path string, method func(user *g
supports.Error(ctx, iris.StatusBadRequest, "未获取到包装单ID", nil)
return
}
err := method(user, data.PackOrderId, data.TemplateId)
err := method(user, data.PackOrderId)
if err != nil {
supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
return
@ -559,4 +558,50 @@ func RegisterSelectOperatePackOrder(party router.Party, path string, method func
}
supports.Ok(ctx, supports.OptionSuccess, result)
})
}
/******************************************************************************
*
* @Function Name : RegisterSplitPackOrderBySerialOrderId
*-----------------------------------------------------------------------------
*
* @Description : 拆包
*
* @Function Parameters : 路由分组
*
* @Function Parameters : 路径
*
* @Function Parameters : 实际处理请求的方法
*
* @Author : zhangxin
*
* @Date : 2021-11-09
*
******************************************************************************/
func RegisterSplitPackOrderBySerialOrderId(party router.Party, path string, method func(user *global.User, packOrderId string) error) {
party.Post(path, func(ctx iris.Context) {
user, ok := jwts.ParseToken(ctx)
if !ok {
return
}
type Req struct {
SerialOrderId string `json:"serialOrderId"`
}
var data Req
if err := ctx.ReadJSON(&data); err != nil {
supports.Error(ctx, iris.StatusBadRequest, "解析参数错误" + err.Error(), nil)
return
}
if data.SerialOrderId == "" {
supports.Error(ctx, iris.StatusBadRequest, "未获取到工单ID", nil)
return
}
err := method(user, data.SerialOrderId)
if err != nil {
supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
return
}
supports.Ok(ctx, supports.OptionSuccess, nil)
})
}

+ 4
- 0
web/controllers/jit/jit.go View File

@ -227,6 +227,10 @@ func RegisterRoutes() {
RegisterSplitPackOrder(packorder, "/split", serviceOfPackOrder.SplitPackOrder)
// PackOrder 获取当前用户操作中的包装单
RegisterSelectOperatePackOrder(packorder, "/getuserorder", serviceOfPackOrder.GetUserOperatePackOrder)
// PackOrder 关包
RegisterClosePackOrder(packorder, "/close", serviceOfPackOrder.ClosePackOrder)
// PackOrder 通过工单ID拆包
RegisterSplitPackOrderBySerialOrderId(packorder, "/splitbyserialorder", serviceOfPackOrder.SplitPackOrderBySerialOrderId)
// PackOrderStatus的路由组
packorderstatus := party.Party("/packorderstatus")


Loading…
Cancel
Save