Browse Source

Merge branch 'feature_specialship' of http://101.201.121.115:3000/leo/LAPP_Acura_MES_Backend into develop

pull/233/head
zhangxin 2 years ago
parent
commit
3fcb0bbccf
10 changed files with 243 additions and 27 deletions
  1. +6
    -1
      dao/base/implments/Snr.dao.impl.go
  2. +3
    -2
      models/jit/const.go
  3. +1
    -0
      models/me/const.go
  4. +17
    -0
      services/jit/ShipOrder.service.go
  5. +64
    -23
      services/jit/implments/ShipOrder.service.impl.go
  6. +1
    -1
      services/me/implments/ProductFamily.service.impl.go
  7. +107
    -0
      services/om/implments/SerialOrder.Logic.impl.go
  8. +6
    -0
      services/pln/implments/CustOrderLogic.service.impl.go
  9. +36
    -0
      web/controllers/jit/ShipOrder.rest.go
  10. +2
    -0
      web/controllers/jit/jit.go

+ 6
- 1
dao/base/implments/Snr.dao.impl.go View File

@ -609,7 +609,9 @@ func (impl *SnrDAOImplement) GetSessionNextSnr(user *global.User, session *xorm.
nextsnr = snrtab.NextNr
}
}
if nextsnr > snrtab.EndNr {
return "", grmi.NewBusinessError("流水号越界")
}
// 组合返回值
layout = []byte(snrtab.Identifierlayout)
for i = 0; i < len(layout); i++ {
@ -958,6 +960,9 @@ func (impl *SnrDAOImplement) GetNextSnrWithTime(snr string, t time.Time) (return
if err != nil {
return "", err
}
if nextSnr > snrData.EndNr {
return "", grmi.NewBusinessError("流水号越界")
}
// 组合返回值
layout := []byte(snrData.Identifierlayout)
for i := 0; i < len(layout); i++ {


+ 3
- 2
models/jit/const.go View File

@ -7,8 +7,9 @@ const (
MONGO_USER_SHIP_DATABASE = "UserShipDB"
MONGOD_USER_SHIP_COLLECTION = "UserShipCollection"
SHIP_TYPE_ADVANCE = "ADVANCE"
SHIP_TYPE_FORMAL = "FORMAL"
SHIP_TYPE_ADVANCE = "ADVANCE" // 预发运
SHIP_TYPE_FORMAL = "FORMAL" // 正式发运
SHIP_TYPE_SPECIAL = "SPECIAL" // 特殊发运
// 包装单状态变更类型
PACK_STATUS_CHANGE_TYPE_SHIP = "SHIP"


+ 1
- 0
models/me/const.go View File

@ -7,4 +7,5 @@ const (
PRODUCT_TYPE_60 = "60%" // 60%
PRODUCT_TYPE_CUSHION = "CUSHION" // 坐垫
PRODUCT_TYPE_PRE = "PRE" // 预装
PRODUCT_TYPE_GAAS = "GAAS" // GAAS
)

+ 17
- 0
services/jit/ShipOrder.service.go View File

@ -357,6 +357,23 @@ type ShipOrderService interface {
*
******************************************************************************/
WithdrawShipOrderItem(user *global.User, shipOrderId string, pos int) error
/******************************************************************************
*
* @Function Name : CreateSpecialShipOrder
*-----------------------------------------------------------------------------
*
* @Description : 创建特殊发运单
*
* @Function Parameters : 当前访问人员信息
*
* @Return Value : 执行时发生的错误
*
* @Author : zhangxin
*
* @Date : 2022-05-13
*
******************************************************************************/
CreateSpecialShipOrder(user *global.User) error
}
/******************************************************************************


+ 64
- 23
services/jit/implments/ShipOrder.service.impl.go View File

@ -763,6 +763,17 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
shipOrderStatusDao := dal.NewShipOrderStatusDAO(session, user.PlantNr, user.UserId)
shipOrderStatusHistoryDao := dal.NewShipOrderStatusHistoryDAO(session, user.PlantNr, user.UserId)
workPlaceConfigDao := baseDal.NewWorkPlaceConfigDAO(session, user.PlantNr, user.UserId)
// 3. 校验发运单数据
shipOrder, err := shipOrderDao.SelectOneWithStatus(shipOrderId)
if err != nil {
return nil, grmi.NewBusinessError("查询发运单数据失败, error:" + err.Error())
}
if shipOrder == nil {
return nil, grmi.NewBusinessError("该发运单不存在, 发运单ID:" + shipOrderId)
}
if shipOrder.ShipOrderStatus.Status >= model.SHIP_STATUS_CLOSED {
return nil, grmi.NewBusinessError("该发运单状态不支持该操作, 发运单ID:" + shipOrderId)
}
plantDao := baseDal.NewPlantDAO(session, user.UserId)
plant, err := plantDao.SelectOne(user.PlantNr)
if err != nil {
@ -773,7 +784,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
}
plantProject := plant.PlantProject
var workPlaceConfig *baseModel.WorkPlaceConfig
if plantProject == baseModel.PROJECT_ACURA {
if plantProject == baseModel.PROJECT_ACURA && shipOrder.ShipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
// 获取工位配置
workPlaceConfigLi, err := workPlaceConfigDao.Select([]grmi.Predicate{baseMeta.WorkPlaceConfig_WorkPlaceNr.NewPredicate(grmi.Equal, workPlaceNr)}, nil)
if err != nil {
@ -882,17 +893,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
if len(shipDataLstLi) != 0 {
return nil, grmi.NewBusinessError("该发运单已经存在于发运单中,包装单ID:" + packOrderId)
}
// 3. 校验发运单数据
shipOrder, err := shipOrderDao.SelectOneWithStatus(shipOrderId)
if err != nil {
return nil, grmi.NewBusinessError("查询发运单数据失败, error:" + err.Error())
}
if shipOrder == nil {
return nil, grmi.NewBusinessError("该发运单不存在, 发运单ID:" + shipOrderId)
}
if shipOrder.ShipOrderStatus.Status >= model.SHIP_STATUS_CLOSED {
return nil, grmi.NewBusinessError("该发运单状态不支持该操作, 发运单ID:" + shipOrderId)
}
//if packOrder.PackOrder.ShortPackToggle {
// if shipOrder.ShipOrder.ShipType != model.SHIP_TYPE_ADVANCE || shipOrder.ShipOrder.ShipTemplateId != "" {
@ -941,7 +942,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
FromStatus: packOrder.PackOrderStatus.ShipStatus,
ToStatus: model.PACK_STATUS_CLOSED,
ChangeTime: grmi.DateTime(time.Now()),
TriggerPara1: model.SHIP_TYPE_FORMAL,
TriggerPara1: shipOrder.ShipOrder.ShipType,
}
err = packOrderStatusHistoryDao.InsertOne(&packOrderStatusHistory)
if err != nil {
@ -956,10 +957,12 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
}
}
// 如果是预发运单, 且没有指定发运模板
if shipOrder.ShipOrder.ShipType == model.SHIP_TYPE_ADVANCE && shipOrder.ShipOrder.ShipTemplateId == "" {
if shipOrder.ShipOrder.ProjectId != packOrder.ProjectId {
_ = session.Rollback()
return nil, grmi.NewBusinessError("包装项目和发运单项目不一致")
if (shipOrder.ShipOrder.ShipType == model.SHIP_TYPE_ADVANCE && shipOrder.ShipOrder.ShipTemplateId == "") || shipOrder.ShipOrder.ShipType == model.SHIP_TYPE_SPECIAL {
if shipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
if shipOrder.ShipOrder.ProjectId != packOrder.ProjectId {
_ = session.Rollback()
return nil, grmi.NewBusinessError("包装项目和发运单项目不一致")
}
}
// 如果发运单已经进行扫描且需要校验同一派生
if shipOrder.CheckCarSet && shipOrder.ShipOrderStatus.Status == model.SHIP_STATUS_RUNNING {
@ -1084,7 +1087,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
_ = session.Commit()
result.Message = "扫描完成,扫描包装单ID:" + packOrder.PackOrder.PackOrderId + ", 当前发运单ID:" + shipOrderId
result.IsClosed = isClosed
if plantProject == baseModel.PROJECT_ACURA {
if plantProject == baseModel.PROJECT_ACURA && shipOrder.ShipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
err = impl.PermitTrough(workPlaceConfig)
if err != nil {
result.PLCResult = false
@ -1093,7 +1096,6 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
result.PLCResult = true
}
}
return result, nil
} else {
shipOrderLstLi, err := shipOrderLstDao.Select([]grmi.Predicate{meta.ShipOrderItemLst_ShipOrderId.NewPredicate(grmi.Equal, shipOrderId), meta.ShipOrderItemLst_Status.NewPredicate(grmi.LessThen, model.SHIP_STATUS_CLOSED)}, []grmi.Field{meta.ShipOrderItemLst_Pos})
@ -1211,7 +1213,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
return nil, grmi.NewBusinessError("更新发运单数据失败, error:" + err.Error())
}
_ = session.Commit()
if plantProject == baseModel.PROJECT_ACURA {
if plantProject == baseModel.PROJECT_ACURA && shipOrder.ShipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
err = impl.PermitTrough(workPlaceConfig)
if err != nil {
result.PLCResult = false
@ -1266,7 +1268,7 @@ func (impl *ShipOrderServiceImplement) ScanBarCode(user *global.User, barCode st
_ = session.Commit()
result.Message = "扫描完成,扫描包装单ID:" + packOrder.PackOrder.PackOrderId + ", 当前发运单ID:" + shipOrderId
result.IsClosed = false
if plantProject == baseModel.PROJECT_ACURA {
if plantProject == baseModel.PROJECT_ACURA && shipOrder.ShipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
err = impl.PermitTrough(workPlaceConfig)
if err != nil {
result.PLCResult = false
@ -1582,8 +1584,8 @@ func (impl *ShipOrderServiceImplement) CloseShipOrder(user *global.User, shipOrd
if shipOrderData == nil {
return grmi.NewBusinessError("不存在该发运单, 发运单ID:" + shipOrderId)
}
if shipOrderData.ShipOrder.ShipType != model.SHIP_TYPE_ADVANCE {
return grmi.NewBusinessError("该发运单不是预发运单,不允许关闭")
if shipOrderData.ShipOrder.ShipType != model.SHIP_TYPE_ADVANCE && shipOrderData.ShipOrder.ShipType != model.SHIP_TYPE_SPECIAL {
return grmi.NewBusinessError("该发运单类型,不允许关闭")
}
//if shipOrderData.ShipOrder.ShipTemplateId != "" {
// return grmi.NewBusinessError("该发运单已经绑定包装模板, 不允许关闭")
@ -1908,3 +1910,42 @@ func (impl *ShipOrderServiceImplement) WithdrawShipOrderItem(user *global.User,
_ = session.Commit()
return nil
}
// CreateSpecialShipOrder 创建特殊发运单
func (impl *ShipOrderServiceImplement) CreateSpecialShipOrder(user *global.User) error {
engine := db.Eloquent.Master()
session := engine.NewSession()
defer session.Close()
shipOrderDao := dal.NewShipOrderDAO(session, user.PlantNr, user.UserId)
shipOrderStatusDao := dal.NewShipOrderStatusDAO(session, user.PlantNr, user.UserId)
unix := time.Now().Format("20060102150405")
shipOrderId := "SPECIAL" + "-" + unix
shipOrder := model.ShipOrder{
ShipOrderId: shipOrderId,
ShipType: model.SHIP_TYPE_SPECIAL,
OrderInfo: model.SHIP_TYPE_SPECIAL,
OpenTime: grmi.DateTime(time.Now()),
Operator: user.UserId,
}
shipOrderStatus := model.ShipOrderStatus{
ShipOrderId: shipOrderId,
Status: model.SHIP_STATUS_PLANNED,
Status1: model.SHIP_STATUS_PLANNED,
Status2: model.SHIP_STATUS_PLANNED,
}
if err := session.Begin(); err != nil {
return grmi.NewBusinessError("开启事务失败, 错误:" + err.Error())
}
err := shipOrderDao.InsertOne(&shipOrder)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("保存发运单失败, 错误:" + err.Error())
}
err = shipOrderStatusDao.InsertOne(&shipOrderStatus)
if err != nil {
_ = session.Rollback()
return grmi.NewBusinessError("保存发运单状态失败, 错误:" + err.Error())
}
_ = session.Commit()
return nil
}

+ 1
- 1
services/me/implments/ProductFamily.service.impl.go View File

@ -487,7 +487,7 @@ func (impl *ProductFamilyServiceImplement) GeneratePackTemplate(user *global.Use
packTemplateLst := jitModel.PackTemplateItemLst{
PackTemplateId: productFamilyId,
Pos: index + 1,
PartId: product.PartId,
PartId: product.ProductId,
PlanQty: product.PackOrderItemSize,
}
templateLstLi = append(templateLstLi, packTemplateLst)


+ 107
- 0
services/om/implments/SerialOrder.Logic.impl.go View File

@ -2,15 +2,18 @@ package implments
import (
baseDal "LAPP_ACURA_MOM_BACKEND/dao/base"
jitDal "LAPP_ACURA_MOM_BACKEND/dao/jit"
meDal "LAPP_ACURA_MOM_BACKEND/dao/me"
dal "LAPP_ACURA_MOM_BACKEND/dao/om"
"LAPP_ACURA_MOM_BACKEND/db"
"LAPP_ACURA_MOM_BACKEND/global"
"LAPP_ACURA_MOM_BACKEND/grmi"
baseMeta "LAPP_ACURA_MOM_BACKEND/meta/base"
jitMeta "LAPP_ACURA_MOM_BACKEND/meta/jit"
meMeta "LAPP_ACURA_MOM_BACKEND/meta/me"
meta "LAPP_ACURA_MOM_BACKEND/meta/om"
baseModel "LAPP_ACURA_MOM_BACKEND/models/base"
jitModel "LAPP_ACURA_MOM_BACKEND/models/jit"
model "LAPP_ACURA_MOM_BACKEND/models/om"
"LAPP_ACURA_MOM_BACKEND/utils"
"github.com/go-xorm/xorm"
@ -511,3 +514,107 @@ func (impl *SerialOrderServiceImplement) SingleProductTask(user *global.User, se
}
return &insertOrder, nil
}
// BreakUp 打散
func (impl *SerialOrderServiceImplement) BreakUp(user *global.User, barcode string) (err error) {
engine := db.Eloquent.Master()
session := engine.NewSession()
defer session.Close()
// barcode 有可能是总成条码或者是零件条码
SerialOrderDao := dal.NewSerialOrderDAO(session, user.PlantNr, user.UserId)
recvDataDao := dal.NewSerialOrderOPDetailRecvDataLstDAO(session, user.PlantNr, user.UserId)
barcodeDao := dal.NewSerialOrderOnlyBarcodeRecLstDAO(session, user.PlantNr, user.UserId)
statusDao := dal.NewSerialOrderStatusDAO(session, user.PlantNr, user.UserId)
statusRecDao := dal.NewSerialOrderStatusRecLstDAO(session, user.PlantNr, user.UserId)
packOrderItemDao := jitDal.NewPackOrderItemLstDAO(session, user.PlantNr, user.UserId)
// 先查总成 总成不存在再查零件
serialOrder, err := SerialOrderDao.SelectOne(barcode)
if err != nil {
return grmi.NewBusinessError("查询工单失败, 错误:" + err.Error())
}
if serialOrder == nil {
// 通过零件查总成
recvDataLi, err := recvDataDao.Select([]grmi.Predicate{
meta.SerialOrderOPDetailRecvDataLst_RecvData.NewPredicate(grmi.Equal, barcode),
meta.SerialOrderOPDetailRecvDataLst_Status.NewPredicate(grmi.Equal, 1),
}, []grmi.Field{meta.SerialOrderOPDetailRecvDataLst_SerialOrderId})
if err != nil {
return grmi.NewBusinessError("查询工单扫码记录失败, 错误:" + err.Error())
}
if len(recvDataLi) == 0 {
return grmi.NewBusinessError("无效的条码")
}
serialOrderMap := make(map[string]interface{})
for _, recvData := range recvDataLi {
serialOrderMap[recvData.SerialOrderId] = nil
}
if len(serialOrderMap) != 1 {
return grmi.NewBusinessError("该条码使用在多个工单中")
}
var serialOrderId string
for key := range serialOrderMap {
serialOrderId = key
}
serialOrder, err = SerialOrderDao.SelectOne(serialOrderId)
if err != nil {
return grmi.NewBusinessError("查询工单失败, 错误:" + err.Error())
}
if serialOrder == nil {
return grmi.NewBusinessError("使用该条码的工单不存在, 工单条码:" + serialOrderId)
}
}
// 查询工单是否打包, 如果打包状态是80 报错
packOrderItemLi, err := packOrderItemDao.Select([]grmi.Predicate{
jitMeta.PackOrderItemLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId),
jitMeta.PackOrderItemLst_Status.NewPredicate(grmi.Equal, jitModel.PACK_STATUS_CLOSED),
}, nil)
if err != nil {
return grmi.NewBusinessError("查询打包记录失败, 错误:" + err.Error())
}
if len(packOrderItemLi) > 0 {
return grmi.NewBusinessError("该工单已经打包")
}
serialOrderStatus, err := statusDao.SelectOne(serialOrder.SerialOrderId)
if err != nil {
return grmi.NewBusinessError("查询工单状态失败, 错误:" + err.Error())
}
if serialOrderStatus == nil {
return grmi.NewBusinessError("工单状态数据不存在, 错误:" + err.Error())
}
if err = session.Begin(); err != nil {
return grmi.NewBusinessError("开启事务失败, 错误:" + err.Error())
}
defer func() {
if err != nil {
_ = session.Rollback()
} else {
_ = session.Commit()
}
}()
statusHistory := model.SerialOrderStatusRecLst{
SerialOrderId: serialOrder.SerialOrderId,
PrevStatus: serialOrderStatus.Status,
Status: baseModel.WO_STATUS_CANCELED,
StartTime: grmi.DateTime(time.Now()),
Remark1: "BREAK_UP",
}
err = statusRecDao.InsertOne(&statusHistory)
if err != nil {
return grmi.NewBusinessError("保存工单状态变更历史失败, 错误:" + err.Error())
}
serialOrderStatus.Status = baseModel.WO_STATUS_CANCELED
err = statusDao.UpdateOne(serialOrderStatus)
if err != nil {
return grmi.NewBusinessError("更新工单状态变更历史失败, 错误:" + err.Error())
}
updateData := model.SerialOrderOnlyBarcodeRecLst{
Status: 0,
}
err = barcodeDao.UpdateWhere([]grmi.Predicate{
meta.SerialOrderOnlyBarcodeRecLst_SerialOrderId.NewPredicate(grmi.Equal, serialOrder.SerialOrderId),
}, &updateData, meta.SerialOrderOnlyBarcodeRecLst_Status.Name)
if err != nil {
return grmi.NewBusinessError("解绑零件使用记录失败, 错误:" + err.Error())
}
return nil
}

+ 6
- 0
services/pln/implments/CustOrderLogic.service.impl.go View File

@ -610,6 +610,8 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO
var serialOrderId string
if product.CtrlStr1 == meModel.PRODUCT_TYPE_PRE {
serialOrderId = strings.Replace(product.ProductId, "-", "", -1) + "$date$" + "$serialNumber$"
} else if product.CtrlStr1 == meModel.PRODUCT_TYPE_GAAS {
serialOrderId = product.ProductId + "$serialNumber$"
} else {
serialOrderId = product.MachineCode + "$serialNumber$" + product.ProductType + product.ColorValue
}
@ -750,6 +752,10 @@ func (impl *CustOrderServiceImplement) ReleaseCustOrder(user *global.User, custO
break
}
}
//prefix := article.PartId + baseModel.PlantName + time.Now().Format("20060102")
//serialOrderId := strings.Replace(serialNum, "SO-", prefix, 1)
var preSerialNumber string
if needPreOrder {
preSerialNumber, err = snrDao.GetNextSnrWithTime(project.PreOrderSnr, waitReleaseSerialOrderLi[0].PlanStartTime.Restore())


+ 36
- 0
web/controllers/jit/ShipOrder.rest.go View File

@ -728,4 +728,40 @@ func RegisterWithdrawShipOrderItem(party router.Party, path string, method func(
}
supports.Ok(ctx, supports.OptionSuccess, nil)
})
}
/******************************************************************************
*
* @Function Name : RegisterCreateSpecialShipOrder
*-----------------------------------------------------------------------------
*
* @Description : 创建特殊发运单
*
* @Function Parameters : 路由分组
*
* @Function Parameters : 路径
*
* @Function Parameters : 实际处理请求的方法
*
* @Author : zhangxin
*
* @Date : 2022-05-13
*
******************************************************************************/
func RegisterCreateSpecialShipOrder(party router.Party, path string, method func(user *global.User) error) {
party.Post(path, func(ctx iris.Context) {
user, ok := jwts.ParseToken(ctx)
if !ok {
return
}
err := method(user)
if err != nil {
supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
return
}
supports.Ok(ctx, supports.OptionSuccess, nil)
})
}

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

@ -62,6 +62,8 @@ func RegisterRoutes() {
RegisterSelectShipOrderBySerialOrderId(shiporder, "/selectbyserialorder", serviceOfShipOrder.SelectShipDataBySerialOrderId)
// shipOrder 通过工单ID查询发运单
RegisterWithdrawShipOrderItem(shiporder, "/withdrawitem", serviceOfShipOrder.WithdrawShipOrderItem)
// shipOrder 创建特殊发运单
RegisterCreateSpecialShipOrder(shiporder, "/createspecial", serviceOfShipOrder.CreateSpecialShipOrder)
// ShipOrderStatus的路由组
shiporderstatus := party.Party("/shiporderstatus")


Loading…
Cancel
Save