现状
包裹没有客户名,料仓没有客户名,包裹能自动选择尺寸合适的料仓工作。
目标
给带有客户名的包裹分配到拥有同样客户名的料仓工作。
思路
1.导入进来的包裹csv文件格式,新增一个字段CustomerName。
2.在料仓表中新增字PaperPdcName
type StockBinModel struct {
global.GVA_MODEL
Name string `json:"name" gorm:"comment:名称"`
//这是charles改的,4.1
PaperPdcName string `json:"paperPdcName" gorm:"comment:客户名"`
//
PaperWidth float32 `json:"paperWidth" gorm:"comment:纸垛宽度"`
PaperHeight float32 `json:"paperHeight" gorm:"default:5;comment:纸垛厚度"`
//Sort uint `json:"sort" gorm:"default:0;type:smallint;comment:排序"`
Offset float32 `json:"offset" gorm:"default:0;type:float;comment:偏移量"`
PLCTag string `json:"plcTag" gorm:"comment:plc标签"`
Status *PaperTypeStatusEnum `json:"status" gorm:"default:1;comment:状态"`
//IsAuxiliary bool `json:"isAuxiliary" gorm:"default:0;comment:是否副机料仓"`
Pile uint `json:"pile" gorm:"default:1;type:smallint;comment: 层"`
AuxiliaryMachineId *uint `form:"auxiliaryMachineId" json:"auxiliaryMachineId" gorm:"comment:副机ID"`
AuxiliaryMachine *AuxiliaryMachine `json:"auxiliaryMachine" gorm:"foreignKey:AuxiliaryMachineId"`
}
// 获取表名.
func (p StockBinModel) TableName() string {
return "paper_type_templates"
}
3.解析CSV文件
// 监听任务目录
go controller.HotDirMonitorTask()
// 非删除,都应该触发文件夹中文件夹的再次整体解析
if ev.Op&fsnotify.Remove != fsnotify.Remove {
HandleImportFiles()
}
3.1观察到创建了一个packagingBranches,猜测应该是把解析的csv文件放到这里面。
var packagingBranches []model.PackagingBranchModel
// 包裹分组
type PackagingBranchModel struct {
global.GVA_MODEL
TemplateId uint `form:"templateId" json:"templateId" gorm:"comment:模板ID"`
Template PackagingTemplateModel `json:"template" gorm:"foreignKey:TemplateId"`
Length float32 `form:"length" json:"length" gorm:"comment:包长度"`
Width float32 `form:"width" json:"width" gorm:"comment:包宽度"`
Height float32 `form:"height" json:"height" gorm:"comment:包厚度"`
Status *PackagingBranchStatusEnum `form:"status" json:"status" gorm:"comment:状态"`
CalculationPriority CalculationPriorityEnum `form:"calculationPriority" json:"calculationPriority" gorm:"comment:计算优先的方案,use、machine"`
// 长宽对调是否默认不使用
IsExchangeLast bool `form:"isExchangeLast" json:"isExchangeLast" gorm:"comment:"`
Priority *PackagingPriorityEnum `form:"priority" json:"priority" gorm:"comment:优先级,数值越高优先级越高"`
OrderNumber string `form:"orderNumber" json:"orderNumber" gorm:"comment:订单号"`
Total uint `form:"total" json:"total" gorm:"comment:压切任务数量"`
SuccessCount uint `form:"successCount" json:"successCount" gorm:"comment:加工完成数量"`
FailCount uint `form:"failCount" json:"failCount" gorm:"comment:失败数量"`
Remark string `form:"remark" json:"remark" gorm:"comment:备注"`
Paramters string `form:"parameters" json:"parameters" gorm:"comment:参数列表"`
Packagings []PackagingModel `json:"packagings" gorm:"foreignKey:BranchId"`
}
// 压切任务表.
type PackagingModel struct {
global.GVA_MODEL
OperUser string `form:"operUser" json:"operUser" gorm:"操作用户"`
// 模板(箱型文件)ID
BranchId uint `form:"branchId" json:"branchId" gorm:"index:idx_search;comment:批次ID"`
TemplateId uint `form:"templateId" json:"templateId" gorm:"comment:模板ID"`
Template PackagingTemplateModel `json:"template" gorm:"foreignKey:TemplateId"`
Length float32 `form:"packLength" json:"packLength" gorm:"comment:包长度"`
Width float32 `form:"packWidth" json:"packWidth" gorm:"comment:包宽度"`
Height float32 `form:"packHeight" json:"packHeight" gorm:"comment:包厚度"`
UsedLength float32 `form:"usedLength" json:"usedLength" gorm:"comment:压切的总长度"`
UsedWidth float32 `form:"usedWidth" json:"usedWidth" gorm:"comment:压切的总宽度"`
Status *PackagingStatusEnum `form:"status" json:"status" gorm:"comment:状态"`
Priority *PackagingPriorityEnum `form:"priority" json:"priority" gorm:"comment:优先级,数值越高优先级越高"`
CuttingCount uint `form:"cuttingCount" json:"cuttingCount" gorm:"comment:裁切包数量"`
SchemeType string `form:"schemeType" json:"schemeType" gorm:"comment:实际试用方案类型"`
ReadySchemeTypes string `form:"readySchemeTypes" json:"readySchemeTypes" gorm:"comment:预选中方案类型"`
// 计算优先的方案,use、machine
CalculationPriority CalculationPriorityEnum `form:"calculationPriority" json:"calculationPriority" gorm:"comment:计算优先的方案,use、machine"`
// 长宽对调是否默认不使用
IsExchangeLast bool `form:"isExchangeLast" json:"isExchangeLast" gorm:"comment:"`
PaperTypeId uint `form:"paperTypeId" json:"paperTypeId" gorm:"comment:料仓ID"`
//PaperWidth float32 `form:"paperWidth" json:"paperWidth" gorm:"comment:料仓宽度"`
UsedPaperName string `form:"usedPaperName" json:"usedPaperName" gorm:"comment:使用料仓的编码"`
UsedPaperWidth float32 `form:"usedPaperWidth" json:"usedPaperWidth" gorm:"comment:压切所用纸皮的宽度"`
UsedPaperHeight float32 `form:"usedPaperHeight" json:"usedPaperHeight" gorm:"comment:使用料仓的纸皮厚度"`
// 料仓
PaperType StockBinModel `json:"paperType" gorm:"foreignKey:PaperTypeId"`
OrderNumber string `form:"orderNumber" json:"orderNumber" gorm:"comment:订单号"`
Remark string `form:"remark" json:"remark" gorm:"comment:备注"`
Customer1 string `form:"customer1" json:"customer1" gorm:"comment:自定义列1"`
Customer2 string `form:"customer2" json:"customer2" gorm:"comment:自定义列2"`
// 箱型自定义参数
Customer3 string `form:"customer2" json:"customer3" gorm:"comment:自定义列3"`
// 发送到 PLC 的时间
SentAt *time.Time `form:"sentTime" json:"sentTime" gorm:"comment:发送到 PLC 的时间"`
// 上传到阿里云的时间
UploadedAt *time.Time `form:"uploadedTime" json:"uploadedTime" gorm:"comment:上传到阿里云的时间"`
// 当前是主机时,存储的是对应的副机包裹id;如果当前是副机,存储是的对应的主机的包裹id
AnotherPackagingId uint `form:"anotherPackagingId" json:"anotherPackagingId" gorm:"comment:另外一台主机上的包裹ID"`
// 流程
WorkFlow WorkFlowStruct `form:"workFlow" json:"workFlow" gorm:"comment:流程"`
// 打印状态
PrintStatus *PackagingPrintStatusEnum `form:"printStatus" json:"printStatus" gorm:"comment:打印状态"`
}
看不懂这个aiegle什么意思,没有注释。ImportFileTypeEnum_Aiege = "aiegle"
麻了,aiegle对应的是一个特殊的客户。遇到防御性代码了。
3.2进入到解析文件的方法
遇到防御性代码了。
parsePackagingBranchWithFile_Aiegle(fileName, originFileContent)
这个才是普遍的。
parsePackagingBranchWithFile(fileName, originFileContent)
为了使该系统具有适应性,我把这个客户名单独拎出来做个分支。要用这个分支的话就在配置文件改里改就好了。
else if global.GVA_CONFIG.Excel.ImportFileType == config.ImportFileTypeEnum_MS {
//charles 客户名 6.20
packagingBranches, err =
parsePackagingBranchWithFile_MS(fileName, originFileContent)
先把它放到结构体里 ,因为我调试这边一直有问题,所以先不测。
case 9:
var customer = value
//获取客户名 charles6.10
packagingBranch.PdcPaperName = customer
4.寻找合适料仓
func getInfoList(tx *gorm.DB, condition resourceReq.PaperTypeSearch) (
list []model.StockBinModel, total int64, err error) {
// 获取可用的料仓列表
func (instance PaperTypeService) GetMineAvailableList() (
list []model.StockBinModel, total int64, err error) {
4.1 这涉及到了查询数据库,里面有主机和副机之分。
先查询了可用的料仓列表,居然没有传参匹配要用的幅宽。
4.2查了全部可用的料仓,要找到怎么根据传入的幅宽选择合适的料仓才行。
4.3 计算结束后它是有显示料仓的选择的
所以方向没问题,继续找。
********************************************************************************
5.现在根据断点从新开始
5.1解析完文件会将,文件数据保存到这个表里
// 保存数据
for index, _ := range packagingBranches {
packagingBranches[index].Packagings = []model.PackagingModel{}
}
// 压切任务表.
type PackagingModel struct {
我得新增字段customer
6.又有一个方面感觉从这反面出发也可以
在查询全部可用料仓的时候,我把包裹自带的字段也传过去,查询到的结果符合要求。
该怎么传呢?
我想直接从这个包导到另一个包,但是报错了
package gitee.com/cut-machine-go/server imports gitee.com/cut-machine-go/server/cmd/controller imports gitee.com/cut-machine-go/server/plugin/packaging/service imports gitee.com/cut-machine-go/server/cmd/controller: import cycle not allowed
func getInfoList2(tx *gorm.DB, condition resourceReq.PaperTypeSearch) (
在这里改了,目测好像可以了。有待测试。逻辑是文件传过来的时候,修改一个全局变量,将客户名赋值给这个全局变量,在选择料仓的时候查表的时候查询与客户名一模一样的料仓。
要解决一个问题:文件传过来的是中文,但是我打印出来我获得的客户名却是乱码了。数字和英文没问题。
找到了:要么在传给我的文件改成utf-8编码格式,要么只能我在源代码上面改:怎么将这个不知道什么格式编码的文件读取并转换成功。
系统有多种的模式,该怎么分配呢,比如我现在选择的客户名模式。在配置文件里改,importFileType:ms。
func (packagingService *PackagingService) Calculate2(packaging model.PackagingModel) (
这个是用的,他有个calculate 是不用的。
这个思路没问题,现在就是要更新手动新增包裹内容
新增个客户名选择,不要让工人输入。将客户名查询出来。 添加一个接口,查询客户名。
添加一个看看
写好查询接口
该功能已经完成了
为了与前版本(主线)界面上区分开来,我用了一个配置文件来更改,只要改配置文件就可以从主线转换到这个客户名版本。
在set up 里面。
const configData = ref([
{
excel:{
importFileType: "packsize",
},
}
]);
// 获取系统配置
const getApplicationConfigFunc = async () => {
const table = await getApplicationConfig();
if (table.code === 0) {
configData.value = table.data;
}
};
getApplicationConfigFunc();
<el-form-item label="客户名" prop="pdcPaperName" v-if="configData.excel.importFileType=='MS'">
在fromdata里面也加一个字段客户名,注意这个字段要与后端接受的要一致。
在发起创建任务的时候也加一个判断
if global.GVA_CONFIG.Excel.ImportFileType == config.ImportFileTypeEnum_MS {
global.CustomerHotFolders = singleReq.PdcPaperName
fmt.Println(global.CustomerHotFolders)
}
在获取可用料仓的时候也加一个判断
if global.GVA_CONFIG.Excel.ImportFileType == config.ImportFileTypeEnum_MS {
return getInfoList2(nil, searchCondition)
}
return getInfoList(nil, searchCondition)
7. 检查 重做任务的时候会不会调用料仓,还是会调用其他数据。
func (resourceApi *PackagingBranchApi) ReWork(c *gin.Context) {
根据传入的ID和需要重新加工的数量。根据传入的id,从数据库PackagingBranchService表中查到对应id的对象。创建新任务,传入数量
进入deepCOPY2REWORK,包含所有的数据所有数据。
在重新加工的api里面也加了修改全局变量的CustomerHotFolders 。