作者 陈志颖

feat:添加分红订单导入和分红退货单导入服务

... ... @@ -19,7 +19,7 @@ type CooperationContractByUndertakerDto struct {
// 项目合约名称
CooperationContractName string `json:"cooperationContractName"`
// 合同附件
Attachment []*domain.Attachment
Attachment []*domain.Attachment `json:"attachment"`
// 发起人姓名
SponsorName string `json:"sponsorName"`
// 发起部门名称
... ...
... ... @@ -40,7 +40,7 @@ type CreateDividendsOrderCommand struct {
// 订单操作人uid
OperatorUid string `cname:"订单操作人uid" json:"operatorUid,omitempty"`
// 订单产品列表
OrderGoods []*OrderGoods `cname:"订单产品列表" json:"orderGoods,omitempty"`
OrderGoods []OrderGoods `cname:"订单产品列表" json:"orderGoods,omitempty"`
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId" valid:"Required"`
// 组织机构ID
... ... @@ -49,10 +49,11 @@ type CreateDividendsOrderCommand struct {
UserId int64 `cname:"用户ID" json:"userId" valid:"Required"`
// 用户基础信息id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId" valid:"Required"`
// 记录行号
LineNumbers []int `cname:"记录行号" json:"lineNumbers"`
}
func (createDividendsOrderCommand *CreateDividendsOrderCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (createDividendsOrderCommand *CreateDividendsOrderCommand) ValidateCommand() error {
... ...
... ... @@ -5,47 +5,46 @@ import (
"github.com/beego/beego/v2/core/validation"
"reflect"
"strings"
"time"
)
type ImportDividendsOrderCommand struct {
// 订单数据列表
DividendsOrderData []*DividendsOrderData `cname:"订单数据列表" json:"dividendsOrderData" valid:"Required"`
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId"`
// 组织机构ID
OrgId int64 `cname:"组织机构ID" json:"orgId"`
// 用户ID,通过集成REST上下文获取,可翻译成发起人、承接人、推荐人、业务员
UserId int64 `cname:"用户ID" json:"userId"`
// 用户基础信息id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId"`
}
type (
ImportDividendsOrderData struct {
//来源单号,源单号,订单号
OriginalOrderNum string `json:"originalOrderNum"`
//订单客户名称
DividendsCustomerName string `json:"dividendsCustomerName"`
//订单产品名称
OrderGoodName string `json:"orderGoodName"`
//订单日期
OrderTime string `json:"orderTime"`
//订单区域名称
RegionName string `json:"regionName"`
//订单产品数量
OrderGoodQuantity string `json:"orderGoodQuantity"`
//订单产品单价
OrderGoodPrice string `json:"orderGoodPrice"`
//费用
Expense string `json:"expense"`
//合约编号
CooperationContractNumber string `json:"cooperationContractNumber"`
}
type DividendsOrderData struct {
// 客户名称
CustomerName string `cname:"客户名称" json:"customerName" valid:"Required"`
// 分红订单金额
DividendsOrderAmount float64 `cname:"分红订单金额" json:"dividendsOrderAmount" valid:"Required"`
// 分红订单号
DividendsOrderNumber string `cname:"分红订单号" json:"dividendsOrderNumber" valid:"Required"`
// 分红订单原单号
DividendsOriginalOrderNum string `cname:"分红订单原单号" json:"dividendsOriginalOrderNum" valid:"Required"`
// 订单产生时间
OrderTime time.Time `cname:"订单产生时间" json:"orderTime" valid:"Required"`
// 订单区域名称
RegionName string `cname:"订单区域名称" json:"regionName,omitempty"`
// 订单业务员uid
SalesmanUid string `cname:"订单业务员UID" json:"salesmanUid,omitempty"`
// 订单产品列表
OrderGoods []*OrderGoods `cname:"订单产品列表" json:"orderGoods,omitempty"`
// 订单操作人uid
OperatorUid string `cname:"订单操作人UID" json:"operatorUid,omitempty"`
// 备注
Remarks string `cname:"备注" json:"remarks,omitempty"`
}
// ImportDividendsOrderCommand 请求参数
ImportDividendsOrderCommand struct {
// 分红订单数据
DividendsOrderData []ImportDividendsOrderData `json:"dividendsOrderData"` //分红订单数据列表
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId"`
// 组织机构ID
OrgId int64 `cname:"组织机构ID" json:"orgId"`
// 用户ID,通过集成REST上下文获取,可翻译成发起人、承接人、推荐人、业务员
UserId int64 `cname:"用户ID" json:"userId"`
// 用户基础信息id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId"`
}
)
func (importDividendsOrderCommand *ImportDividendsOrderCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (importDividendsOrderCommand *ImportDividendsOrderCommand) ValidateCommand() error {
... ...
package service
import (
"crypto/md5"
"encoding/hex"
"fmt"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
... ... @@ -11,7 +13,10 @@ import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain/service"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/utils"
"reflect"
"regexp"
"strconv"
"strings"
"time"
)
... ... @@ -272,10 +277,340 @@ func (dividendsOrderService *DividendsOrderService) ImportDividendsOrder(importD
dividendsOrderRepository = value
}
var dividendsOrderImportFailed []*domain.DividendsOrder
var dividendsOrderImportSuccessfully []*domain.DividendsOrder
// 返回信息表头定义
var tableHeader = []string{"错误详情", "行号", "来源单号", "客户名称", "产品名称", "订单日期", "订单区域", "产品数量", "产品价格", "费用", "项目合约编号"}
// 空文件校验
if len(importDividendsOrderCommand.DividendsOrderData) == 0 {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "导入的Excel文件为空文件,请上传正确的文件")
}
// 必填项校验
nullCellError := make([]interface{}, 0)
// 数据行计数
rowCnt := 0
// 空行标志位
nullFlag := false
for i, dividendsOrder := range importDividendsOrderCommand.DividendsOrderData {
rowCnt++
nullCell := make([]interface{}, 0)
var myRow []string
t := reflect.TypeOf(dividendsOrder)
v := reflect.ValueOf(dividendsOrder)
for k := 0; k < t.NumField(); k++ {
//fmt.Println("name:", fmt.Sprintf("%+v", t.Field(k).Name), ", value:", fmt.Sprintf("%v", v.Field(k).Interface()), ", yaml:", t.Field(k).Tag.Get("yaml"))
if k != 7 && k != 8 {
if v.Field(k).Interface() == "" {
col := strconv.Itoa(k + 1)
nullCell = append(nullCell, col)
nullFlag = true
}
}
}
if nullFlag {
s := strconv.Itoa(i + 1)
b := strings.Replace(strings.Trim(fmt.Sprint(nullCell), "[]"), " ", ",", -1)
myRow = append(myRow, "第"+s+"行的第"+b+"列必填项为空") // 错误信息
myRow = append(myRow, s) // 行号
myRow = append(myRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
nullCellError = append(nullCellError, myRow)
nullFlag = false
}
}
// 必填项错误返回
if len(nullCellError) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": nullCellError,
},
}, nil
}
// 单元格类型校验
typeError := make([]interface{}, 0)
for i, dividendsOrder := range importDividendsOrderCommand.DividendsOrderData { // 行
var myRow []string
t := reflect.TypeOf(dividendsOrder)
v := reflect.ValueOf(dividendsOrder)
for k := 0; k < t.NumField(); k++ { // 列
r := strconv.Itoa(i + 1)
col := strconv.Itoa(k + 1)
switch k {
case 3: // 订单日期校验
{
regexpStr := `(\d{4})/(\d{2})/(\d{2})`
ok := regexp.MustCompile(regexpStr).MatchString(fmt.Sprintf("%v", v.Field(k).Interface()))
if !ok {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列订单日期格式错误,请输入正确的订单日期") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 5: // 产品数量校验
{
//参数类型转换
orderGoodQuantity, err := strconv.ParseInt(fmt.Sprintf("%v", v.Field(k).Interface()), 10, 64)
if err != nil {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列产品数量格式错误,产品数量必须整数") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
// 正负判断
if orderGoodQuantity < 0 {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列产品数量必须大于0,请重新填写") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 6: // 产品价格校验
{
// 参数类型转换
univalent, typeErr := strconv.ParseFloat(fmt.Sprintf("%v", v.Field(k).Interface()), 64)
if typeErr != nil {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列产品价格格式错误,产品价格必须为数字类型") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
// 长度校验
if univalent >= 1e16 {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列产品价格超过最大限制,产品价格小数点前面不能超过十六位数字,并保留两位小数") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 7: // 费用校验
{
if fmt.Sprintf("%v", v.Field(k).Interface()) != "" {
// 参数类型转换
univalent, typeErr := strconv.ParseFloat(fmt.Sprintf("%v", v.Field(k).Interface()), 64)
if typeErr != nil {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列费用格式错误,费用必须为数字类型") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
// 长度校验
if univalent >= 1e16 {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列费用超过最大限制,费用小数点前面不能超过十六位数字,并保留两位小数") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
}
}
}
if myRow != nil {
typeError = append(typeError, myRow)
}
}
// 类型错误行返回
if len(typeError) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": typeError,
},
}, nil
}
// 聚合订单并进行类型校验
aggregateErrorList := make([]interface{}, 0)
var dividendsOrderCommands = make(map[string]*command.CreateDividendsOrderCommand)
for i, dividendsOrder := range importDividendsOrderCommand.DividendsOrderData {
hashValue := md5.Sum([]byte(dividendsOrder.OriginalOrderNum))
hashString := hex.EncodeToString(hashValue[:])
if _, ok := dividendsOrderCommands[hashString]; !ok {
// 来源单号
dividendsOrderCommands[hashString].DividendsOriginalOrderNum = dividendsOrder.OriginalOrderNum
// 客户名称
dividendsOrderCommands[hashString].CustomerName = dividendsOrder.DividendsCustomerName
// 订单日期时间格式转换
timeValue, err := time.ParseInLocation("2006/01/02", dividendsOrder.OrderTime, time.Local)
if err != nil {
var tmpRow []string
tmpRow = append(tmpRow, "无效的订单日期") // 错误信息
s := strconv.Itoa(i + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, dividendsOrder.OriginalOrderNum) // TODO 错误行数据
aggregateErrorList = append(aggregateErrorList, tmpRow)
break
}
// 产品相关:产品名称,产品数量、产品价格、费用
quantity, err := strconv.ParseInt(dividendsOrder.OrderGoodQuantity, 10, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
price, err := strconv.ParseFloat(dividendsOrder.OrderGoodPrice, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
expense, err := strconv.ParseFloat(dividendsOrder.Expense, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
// 初始化新建分红订单命令集
dividendsOrderCommands[hashString] = &command.CreateDividendsOrderCommand{
CustomerName: dividendsOrder.DividendsCustomerName,
DividendsOriginalOrderNum: dividendsOrder.OriginalOrderNum,
OrderTime: string(rune(timeValue.Nanosecond() / 1000)),
Remarks: "",
RegionName: dividendsOrder.RegionName,
OperatorUid: strconv.FormatInt(importDividendsOrderCommand.UserId, 10),
OrderGoods: []command.OrderGoods{
{
OrderGoodId: "0",
OrderGoodAmount: 0,
OrderGoodName: dividendsOrder.OrderGoodName,
OrderGoodPrice: price,
OrderGoodQuantity: quantity,
DividendsOrderNumber: "",
CooperationContractNumber: dividendsOrder.CooperationContractNumber,
OrderGoodExpense: expense,
},
},
CompanyId: importDividendsOrderCommand.CompanyId,
OrgId: importDividendsOrderCommand.OrgId,
UserId: importDividendsOrderCommand.UserId,
UserBaseId: importDividendsOrderCommand.UserBaseId,
LineNumbers: []int{i}, // 记录行号
}
} else { // 聚合同一笔订单产品
// 产品相关:产品名称,产品数量、产品价格、费用
quantity, err := strconv.ParseInt(dividendsOrder.OrderGoodQuantity, 10, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
price, err := strconv.ParseFloat(dividendsOrder.OrderGoodPrice, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
expense, err := strconv.ParseFloat(dividendsOrder.Expense, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
dividendsOrderCommands[hashString].OrderGoods = append(dividendsOrderCommands[hashString].OrderGoods, command.OrderGoods{
OrderGoodId: "0",
OrderGoodAmount: 0,
OrderGoodName: dividendsOrder.OrderGoodName,
OrderGoodPrice: price,
OrderGoodQuantity: quantity,
DividendsOrderNumber: "",
CooperationContractNumber: dividendsOrder.CooperationContractNumber,
OrderGoodExpense: expense,
})
// 记录聚合行号
dividendsOrderCommands[hashString].LineNumbers = append(dividendsOrderCommands[hashString].LineNumbers, i)
}
}
// 聚合订单错误返回
if len(aggregateErrorList) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": aggregateErrorList,
},
}, nil
}
// 批量创建分红订单命令集
var createDividendsOrderCommands []*command.CreateDividendsOrderCommand
for _, dividendsOrderCommand := range dividendsOrderCommands {
createDividendsOrderCommands = append(createDividendsOrderCommands, dividendsOrderCommand)
}
// 新增失败记录
failureDataList := make([]interface{}, 0)
// 新增成功记录计数
var successDataCount int64
// 错误数据返回
var errorDataList []*domain.ImportInfo
// 循环校验命令
for _, cmd := range createDividendsOrderCommands {
if err = cmd.ValidateCommand(); err != nil {
// 返回信息
row := &domain.ImportInfo{
Error: application.ThrowError(application.BUSINESS_ERROR, err.Error()), // 错误信息
LineNumbers: cmd.LineNumbers, // 错误影响的行
GoodLine: map[int]interface{}{},
}
errorDataList = append(errorDataList, row)
continue
}
}
// 循环校验命令失败返回
if len(errorDataList) > 0 {
successDataCount = 0
// 错误记录处理
for _, errorData := range errorDataList {
if len(errorData.GoodLine) == 0 { // 订单错误
for _, line := range errorData.LineNumbers {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
} else if len(errorData.GoodLine) > 0 { // 订单产品错误
for line := range errorData.GoodLine {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
}
}
return map[string]interface{}{
"successCount": successDataCount,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": failureDataList,
},
}, nil
}
// 批量导入创建分红订单
for _, dividendsOrder := range createDividendsOrderCommands {
for _, dividendsOrder := range importDividendsOrderCommand.DividendsOrderData {
// 生成分红订单号
dividendsOrderNumber, err := dividendsOrderDao.GenerateDividendsOrderNumber()
if err != nil {
... ... @@ -319,13 +654,20 @@ func (dividendsOrderService *DividendsOrderService) ImportDividendsOrder(importD
dividendsOrderAmount = dividendsOrderAmount + orderGood.OrderGoodAmount
}
// 订单时间转换
orderTimeInt, err := strconv.ParseInt(dividendsOrder.OrderTime, 10, 64)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "订单时间错误")
}
orderTime := utils.TransformTimestampToTime(orderTimeInt)
// 新增分红订单
newDividendsOrder := &domain.DividendsOrder{
DividendsOrderId: 0,
DividendsOrderNumber: dividendsOrderNumber,
DividendsOriginalOrderNum: dividendsOrder.DividendsOriginalOrderNum,
DividendsOrderAmount: dividendsOrderAmount,
OrderTime: dividendsOrder.OrderTime,
OrderTime: orderTime,
DividendTime: time.Time{},
DividendStatus: domain.TO_BE_DIVIDEND,
Region: &domain.RegionInfo{
... ... @@ -343,17 +685,58 @@ func (dividendsOrderService *DividendsOrderService) ImportDividendsOrder(importD
Operator: operator,
}
if dividendsOrderSaved, err2 := dividendsOrderRepository.Save(newDividendsOrder); err2 != nil {
dividendsOrderImportFailed = append(dividendsOrderImportFailed, newDividendsOrder)
} else {
dividendsOrderImportSuccessfully = append(dividendsOrderImportSuccessfully, dividendsOrderSaved)
if _, err2 := dividendsOrderRepository.Save(newDividendsOrder); err2 != nil {
row := &domain.ImportInfo{
Error: application.ThrowError(application.INTERNAL_SERVER_ERROR, fmt.Sprintf("保存订单数据失败:%s", err)),
LineNumbers: dividendsOrder.LineNumbers, // 错误影响的行
GoodLine: map[int]interface{}{},
}
errorDataList = append(errorDataList, row)
continue
}
}
if len(dividendsOrderImportFailed) == 0 {
if len(errorDataList) <= 0 {
if err3 := transactionContext.CommitTransaction(); err3 != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err3.Error())
}
return dividendsOrderImportSuccessfully, nil
successDataCount = int64(rowCnt - len(failureDataList))
if successDataCount == int64(rowCnt) {
return map[string]interface{}{
"successCount": successDataCount,
"fail": nil,
}, nil
}
} else {
successDataCount = 0
// 错误记录处理
for _, errorData := range errorDataList {
if len(errorData.GoodLine) == 0 { // 订单错误
for _, line := range errorData.LineNumbers {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
} else if len(errorData.GoodLine) > 0 { // 订单产品错误
for line := range errorData.GoodLine {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
}
}
return map[string]interface{}{
"successCount": successDataCount,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": failureDataList,
},
}, nil
}
return nil, nil
}
... ...
... ... @@ -5,7 +5,6 @@ import (
"github.com/beego/beego/v2/core/validation"
"reflect"
"strings"
"time"
)
type OrderGoods struct {
... ... @@ -20,7 +19,7 @@ type OrderGoods struct {
// 订单产品数量
OrderGoodQuantity int64 `cname:"订单产品数量" json:"orderGoodQuantity"`
// 关联分红订单号
DividendsOrderNumber int64 `cname:"关联分红订单号" json:"dividendsOrderNumber"`
DividendsOrderNumber string `cname:"关联分红订单号" json:"dividendsOrderNumber"`
// 关联的共创合约编号
CooperationContractNumber string `cname:"关联的共创合约编号" json:"cooperationContractNumber"`
// 订单产品费用
... ... @@ -39,13 +38,15 @@ type CreateDividendsReturnedOrderCommand struct {
// 备注
Remarks string `cname:"备注" json:"remarks" valid:"Required"`
// 退货日期
DividendsReturnedDate time.Time `cname:"退货日期" json:"dividendsReturnedDate" valid:"Required"`
DividendsReturnedDate string `cname:"退货日期" json:"dividendsReturnedDate" valid:"Required"`
// 订单日期
OrderTime string `cname:"订单日期" json:"orderTime" valid:"Required"`
// 退货区域名称
RegionName string `cname:"退货区域名称" json:"regionName,omitempty"`
// 订单操作人uid
OperatorUid string `cname:"订单操作人uid" json:"operatorUid,omitempty"`
// 订单产品列表
OrderGoods []*OrderGoods `cname:"订单产品列表" json:"orderGoods,omitempty"`
OrderGoods []OrderGoods `cname:"订单产品列表" json:"orderGoods,omitempty"`
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId" valid:"Required"`
// 组织机构ID
... ... @@ -54,10 +55,11 @@ type CreateDividendsReturnedOrderCommand struct {
UserId int64 `cname:"用户ID" json:"userId" valid:"Required"`
// 用户基础数据id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId" valid:"Required"`
// 记录行号
LineNumbers []int `cname:"记录行号" json:"lineNumbers"`
}
func (createDividendsReturnedOrderCommand *CreateDividendsReturnedOrderCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (createDividendsReturnedOrderCommand *CreateDividendsReturnedOrderCommand) ValidateCommand() error {
... ...
... ... @@ -5,7 +5,6 @@ import (
"github.com/beego/beego/v2/core/validation"
"reflect"
"strings"
"time"
)
type (
... ... @@ -17,58 +16,35 @@ type (
//订单产品名称
OrderGoodName string `json:"orderGoodName"`
//退货日期
DividendsReturnedDate time.Time `json:"dividendsReturnedDate"`
DividendsReturnedDate string `json:"dividendsReturnedDate"`
//退货区域名称
RegionName string `json:"regionName"`
//订单产品单价
OrderGoodPrice float64 `json:"orderGoodPrice"`
OrderGoodPrice string `json:"orderGoodPrice"`
//订单产品数量
OrderGoodQuantity int64 `json:"orderGoodQuantity"`
OrderGoodQuantity string `json:"orderGoodQuantity"`
//合约编号
CooperationContractNumber string `json:"cooperationContractNumber"`
//订单日期
OrderTime string `json:"orderTime"`
}
// ReqImportDividendsReturnedOrder 请求参数
ReqImportDividendsReturnedOrder struct {
// ImportDividendsReturnedOrderCommand 请求参数
ImportDividendsReturnedOrderCommand struct {
// 分红退货单数据
DividendsReturnedOrderData []ImportDividendsReturnedOrderData `json:"dividendsReturnedOrderData"` //分红退货单数据列表
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId"`
// 组织机构ID
OrgId int64 `cname:"组织机构ID" json:"orgId"`
// 用户ID,通过集成REST上下文获取,可翻译成发起人、承接人、推荐人、业务员
UserId int64 `cname:"用户ID" json:"userId"`
// 用户基础数据id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId"`
}
)
// DividendsReturnedOrderData 分红退货单数据
type DividendsReturnedOrderData struct {
// 退货金额
DividendsReturnedOrderRefund float64 `cname:"退货金额" json:"dividendsReturnedOrderRefund" valid:"Required"`
// 退货客户名称
DividendsReturnedCustomerName string `cname:"退货客户名称" json:"dividendsReturnedCustomerName" valid:"Required"`
// 来源单号,源单号,订单号
OriginalOrderNum string `cname:"来源单号" json:"originalOrderNum" valid:"Required"`
// 退货日期
DividendsReturnedDate time.Time `cname:"退货日期" json:"dividendsReturnedDate" valid:"Required"`
// 退货区域名称
RegionName string `cname:"退货区域名称" json:"regionName"`
// 订单产品列表
OrderGoods []*OrderGoods `cname:"订单产品列表" json:"orderGoods"`
// 备注
Remarks string `cname:"备注" json:"remarks"`
}
type ImportDividendsReturnedOrderCommand struct {
// 分红退货单数据
DividendsReturnedOrderData []*DividendsReturnedOrderData `cname:"分红退货单数据列表" json:"dividendsReturnedOrderData" valid:"Required"`
// 公司ID,通过集成REST上下文获取
CompanyId int64 `cname:"公司ID" json:"companyId"`
// 组织机构ID
OrgId int64 `cname:"组织机构ID" json:"orgId"`
// 用户ID,通过集成REST上下文获取,可翻译成发起人、承接人、推荐人、业务员
UserId int64 `cname:"用户ID" json:"userId"`
// 用户基础数据id
UserBaseId int64 `cname:"用户基础数据ID" json:"userBaseId"`
}
func (importDividendsReturnedOrderCommand *ImportDividendsReturnedOrderCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (importDividendsReturnedOrderCommand *ImportDividendsReturnedOrderCommand) ValidateCommand() error {
... ...
package service
import (
"crypto/md5"
"encoding/hex"
"fmt"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
... ... @@ -11,7 +13,10 @@ import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain/service"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/utils"
"reflect"
"regexp"
"strconv"
"strings"
"time"
)
... ... @@ -106,6 +111,13 @@ func (dividendsReturnedOrderService *DividendsReturnedOrderService) CreateDivide
}
orderTime := utils.TransformTimestampToTime(orderTimeInt)
// 退货时间转换
returnedTimeInt, err := strconv.ParseInt(createDividendsReturnedOrderCommand.DividendsReturnedDate, 10, 64)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "退货时间错误")
}
returnedTime := utils.TransformTimestampToTime(returnedTimeInt)
// 校验分红退货单编号是否唯一
numberAvailable, err := dividendsReturnedOrderDao.CheckDividendsReturnedOrderNumberAvailable(map[string]interface{}{
"companyId": createDividendsReturnedOrderCommand.CompanyId,
... ... @@ -147,7 +159,7 @@ func (dividendsReturnedOrderService *DividendsReturnedOrderService) CreateDivide
OriginalOrderNum: createDividendsReturnedOrderCommand.OriginalOrderNum,
DividendsOrderNumber: createDividendsReturnedOrderCommand.DividendsOrderNumber,
DividendsReturnedCustomerName: createDividendsReturnedOrderCommand.DividendsReturnedCustomerName,
DividendsReturnedDate: createDividendsReturnedOrderCommand.DividendsReturnedDate,
DividendsReturnedDate: returnedTime,
Region: &domain.RegionInfo{
RegionNumber: "",
RegionName: createDividendsReturnedOrderCommand.RegionName,
... ... @@ -304,18 +316,342 @@ func (dividendsReturnedOrderService *DividendsReturnedOrderService) ImportDivide
dividendsReturnedOrderRepository = value
}
var dividendsReturnedOrderImportFailed []*domain.DividendsReturnedOrder
var dividendsReturnedOrderImportSuccessfully []*domain.DividendsReturnedOrder
// 返回信息表头定义
var tableHeader = []string{"错误详情", "行号", "来源单号", "客户名称", "产品名称", "退货日期", "订单日期", "订单区域", "退货数量", "退货价格", "项目合约编号"}
// 空文件校验
if len(importDividendsReturnedOrderCommand.DividendsReturnedOrderData) == 0 {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "导入的Excel文件为空文件,请上传正确的文件")
}
// 必填项校验
nullCellError := make([]interface{}, 0)
// 数据行计数
rowCnt := 0
// 空行标志位
nullFlag := false
for i, dividendsReturnedOrder := range importDividendsReturnedOrderCommand.DividendsReturnedOrderData {
rowCnt++
nullCell := make([]interface{}, 0)
var myRow []string
t := reflect.TypeOf(dividendsReturnedOrder)
v := reflect.ValueOf(dividendsReturnedOrder)
for k := 0; k < t.NumField(); k++ {
//fmt.Println("name:", fmt.Sprintf("%+v", t.Field(k).Name), ", value:", fmt.Sprintf("%v", v.Field(k).Interface()), ", yaml:", t.Field(k).Tag.Get("yaml"))
if k != 5 && k != 8 {
if v.Field(k).Interface() == "" {
col := strconv.Itoa(k + 1)
nullCell = append(nullCell, col)
nullFlag = true
}
}
}
if nullFlag {
s := strconv.Itoa(i + 1)
b := strings.Replace(strings.Trim(fmt.Sprint(nullCell), "[]"), " ", ",", -1)
myRow = append(myRow, "第"+s+"行的第"+b+"列必填项为空") // 错误信息
myRow = append(myRow, s) // 行号
myRow = append(myRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
nullCellError = append(nullCellError, myRow)
nullFlag = false
}
}
// 必填项错误返回
if len(nullCellError) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": nullCellError,
},
}, nil
}
// 单元格类型校验
typeError := make([]interface{}, 0)
for i, dividendsReturnedOrder := range importDividendsReturnedOrderCommand.DividendsReturnedOrderData { // 行
var myRow []string
t := reflect.TypeOf(dividendsReturnedOrder)
v := reflect.ValueOf(dividendsReturnedOrder)
for k := 0; k < t.NumField(); k++ { // 列
r := strconv.Itoa(i + 1)
col := strconv.Itoa(k + 1)
switch k {
case 3: // 退货日期校验
{
regexpStr := `(\d{4})/(\d{2})/(\d{2})`
ok := regexp.MustCompile(regexpStr).MatchString(fmt.Sprintf("%v", v.Field(k).Interface()))
if !ok {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列退货日期格式错误,请输入正确的退货日期") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 4: // 订单日期校验
{
regexpStr := `(\d{4})/(\d{2})/(\d{2})`
ok := regexp.MustCompile(regexpStr).MatchString(fmt.Sprintf("%v", v.Field(k).Interface()))
if !ok {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列订单日期格式错误,请输入正确的订单日期") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 6: // 退货数量校验
{
//参数类型转换
orderGoodQuantity, err := strconv.ParseInt(fmt.Sprintf("%v", v.Field(k).Interface()), 10, 64)
if err != nil {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列退货数量格式错误,退货数量必须整数") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
// 正负判断
if orderGoodQuantity < 0 {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列退货数量必须大于0,请重新填写") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
case 7: // 退货价格校验
{
// 参数类型转换
univalent, typeErr := strconv.ParseFloat(fmt.Sprintf("%v", v.Field(k).Interface()), 64)
if typeErr != nil {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列退货价格格式错误,退货价格必须为数字类型") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
// 长度校验
if univalent >= 1e16 {
var tmpRow []string
tmpRow = append(tmpRow, "第"+r+"行第"+col+"列退货价格超过最大限制,退货价格小数点前面不能超过十六位数字,并保留两位小数") // 错误信息
tmpRow = append(tmpRow, r) // 行号
tmpRow = append(tmpRow, fmt.Sprintf("%v", v.Interface())) // 错误行数据
myRow = tmpRow
}
}
}
}
if myRow != nil {
typeError = append(typeError, myRow)
}
}
// 类型错误行返回
if len(typeError) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": typeError,
},
}, nil
}
// 聚合订单并进行类型校验
aggregateErrorList := make([]interface{}, 0)
var dividendsReturnedOrderCommands = make(map[string]*command.CreateDividendsReturnedOrderCommand)
for i, dividendsReturnedOrder := range importDividendsReturnedOrderCommand.DividendsReturnedOrderData {
hashValue := md5.Sum([]byte(dividendsReturnedOrder.OriginalOrderNum))
hashString := hex.EncodeToString(hashValue[:])
if _, ok := dividendsReturnedOrderCommands[hashString]; !ok {
// 来源单号
dividendsReturnedOrderCommands[hashString].OriginalOrderNum = dividendsReturnedOrder.OriginalOrderNum
// 客户名称
dividendsReturnedOrderCommands[hashString].DividendsReturnedCustomerName = dividendsReturnedOrder.DividendsReturnedCustomerName
// 订单日期时间格式转换
timeValue, err := time.ParseInLocation("2006/01/02", dividendsReturnedOrder.OrderTime, time.Local)
if err != nil {
var tmpRow []string
tmpRow = append(tmpRow, "无效的订单日期") // 错误信息
s := strconv.Itoa(i + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, dividendsReturnedOrder.OriginalOrderNum) // TODO 错误行数据
aggregateErrorList = append(aggregateErrorList, tmpRow)
break
}
// 产品相关:产品名称,退货数量、退货价格
quantity, err := strconv.ParseInt(dividendsReturnedOrder.OrderGoodQuantity, 10, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
price, err := strconv.ParseFloat(dividendsReturnedOrder.OrderGoodPrice, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
// 初始化新建分红订单命令集
dividendsReturnedOrderCommands[hashString] = &command.CreateDividendsReturnedOrderCommand{
DividendsReturnedCustomerName: dividendsReturnedOrder.DividendsReturnedCustomerName,
OriginalOrderNum: dividendsReturnedOrder.OriginalOrderNum,
OrderTime: string(rune(timeValue.Nanosecond() / 1000)),
Remarks: "",
RegionName: dividendsReturnedOrder.RegionName,
OperatorUid: strconv.FormatInt(importDividendsReturnedOrderCommand.UserId, 10),
OrderGoods: []command.OrderGoods{
{
OrderGoodId: "0",
OrderGoodAmount: 0,
OrderGoodName: dividendsReturnedOrder.OrderGoodName,
OrderGoodPrice: price,
OrderGoodQuantity: quantity,
DividendsOrderNumber: "",
CooperationContractNumber: dividendsReturnedOrder.CooperationContractNumber,
OrderGoodExpense: 0,
},
},
CompanyId: importDividendsReturnedOrderCommand.CompanyId,
OrgId: importDividendsReturnedOrderCommand.OrgId,
UserId: importDividendsReturnedOrderCommand.UserId,
UserBaseId: importDividendsReturnedOrderCommand.UserBaseId,
LineNumbers: []int{i}, // 记录行号
}
} else { // 聚合同一笔订单产品
// 产品相关:产品名称,退货数量、退货价格
quantity, err := strconv.ParseInt(dividendsReturnedOrder.OrderGoodQuantity, 10, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
price, err := strconv.ParseFloat(dividendsReturnedOrder.OrderGoodPrice, 64)
if err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
for _, dividendsReturnedOrder := range importDividendsReturnedOrderCommand.DividendsReturnedOrderData {
// 生成分红订单号
dividendsReturnedOrderCommands[hashString].OrderGoods = append(dividendsReturnedOrderCommands[hashString].OrderGoods, command.OrderGoods{
OrderGoodId: "0",
OrderGoodAmount: 0,
OrderGoodName: dividendsReturnedOrder.OrderGoodName,
OrderGoodPrice: price,
OrderGoodQuantity: quantity,
DividendsOrderNumber: "",
CooperationContractNumber: dividendsReturnedOrder.CooperationContractNumber,
OrderGoodExpense: 0,
})
// 记录聚合行号
dividendsReturnedOrderCommands[hashString].LineNumbers = append(dividendsReturnedOrderCommands[hashString].LineNumbers, i)
}
}
// 聚合订单错误返回
if len(aggregateErrorList) > 0 {
return map[string]interface{}{
"successCount": 0,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": aggregateErrorList,
},
}, nil
}
// 批量创建分红订单命令集
var createDividendsReturnedOrderCommands []*command.CreateDividendsReturnedOrderCommand
for _, dividendsReturnedOrderCommand := range dividendsReturnedOrderCommands {
createDividendsReturnedOrderCommands = append(createDividendsReturnedOrderCommands, dividendsReturnedOrderCommand)
}
// 新增失败记录
failureDataList := make([]interface{}, 0)
// 新增成功记录计数
var successDataCount int64
// 错误数据返回
var errorDataList []*domain.ImportInfo
// 循环校验命令
for _, cmd := range createDividendsReturnedOrderCommands {
if err = cmd.ValidateCommand(); err != nil {
// 返回信息
row := &domain.ImportInfo{
Error: application.ThrowError(application.BUSINESS_ERROR, err.Error()), // 错误信息
LineNumbers: cmd.LineNumbers, // 错误影响的行
GoodLine: map[int]interface{}{},
}
errorDataList = append(errorDataList, row)
continue
}
}
// 循环校验命令失败返回
if len(errorDataList) > 0 {
successDataCount = 0
// 错误记录处理
for _, errorData := range errorDataList {
if len(errorData.GoodLine) == 0 { // 订单错误
for _, line := range errorData.LineNumbers {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
} else if len(errorData.GoodLine) > 0 { // 订单产品错误
for line := range errorData.GoodLine {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
}
}
return map[string]interface{}{
"successCount": successDataCount,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": failureDataList,
},
}, nil
}
// 批量导入创建退货单
for _, dividendsReturnedOrder := range createDividendsReturnedOrderCommands {
// 生成退货订单号
dividendsReturnedOrderNumber, err := dividendsReturnedOrderDao.GenerateDividendsReturnedOrderNumber()
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
// 获取分红退货单产品
// 校验退货订单编号是否唯一
numberAvailable, err3 := dividendsReturnedOrderDao.CheckDividendsReturnedOrderNumberAvailable(map[string]interface{}{
"companyId": importDividendsReturnedOrderCommand.CompanyId,
"orgId": importDividendsReturnedOrderCommand.OrgId,
"dividendsReturnedOrderNumber": dividendsReturnedOrderNumber,
})
if err3 != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err3.Error())
}
if !numberAvailable {
return nil, application.ThrowError(application.TRANSACTION_ERROR, "新增分红订单异常")
}
// 新增订单产品
var orderGoods []*domain.OrderGood
var dividendsReturnedOrderAmount float64
for _, orderGood := range dividendsReturnedOrder.OrderGoods {
orderGoods = append(orderGoods, &domain.OrderGood{
OrderGoodId: 0,
... ... @@ -326,49 +662,110 @@ func (dividendsReturnedOrderService *DividendsReturnedOrderService) ImportDivide
DividendsOrderNumber: "",
DividendsReturnedOrderNumber: dividendsReturnedOrderNumber,
CooperationContractNumber: orderGood.CooperationContractNumber,
OrderGoodExpense: 0,
OrderGoodExpense: orderGood.OrderGoodExpense,
OrgId: importDividendsReturnedOrderCommand.OrgId,
CompanyId: importDividendsReturnedOrderCommand.CompanyId,
CreatedAt: time.Now(),
DeletedAt: time.Time{},
UpdatedAt: time.Time{},
})
// 计算分红订单金额
dividendsReturnedOrderAmount = dividendsReturnedOrderAmount + orderGood.OrderGoodAmount
}
// 订单时间转换
orderTimeInt, err := strconv.ParseInt(dividendsReturnedOrder.OrderTime, 10, 64)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "订单时间错误")
}
orderTime := utils.TransformTimestampToTime(orderTimeInt)
// 退货时间转换
returnedTimeInt, err := strconv.ParseInt(dividendsReturnedOrder.DividendsReturnedDate, 10, 64)
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "退货时间错误")
}
returnedTime := utils.TransformTimestampToTime(returnedTimeInt)
// 新增退货单
newDividendsReturnedOrder := &domain.DividendsReturnedOrder{
DividendsReturnedOrderId: 0,
DividendsReturnedOrderNumber: dividendsReturnedOrderNumber,
DividendsReturnedOrderRefund: dividendsReturnedOrder.DividendsReturnedOrderRefund,
DividendsReturnedOrderRefund: dividendsReturnedOrderAmount,
OriginalOrderNum: dividendsReturnedOrder.OriginalOrderNum,
DividendsOrderNumber: "",
DividendsReturnedCustomerName: dividendsReturnedOrder.DividendsReturnedCustomerName,
DividendsReturnedDate: dividendsReturnedOrder.DividendsReturnedDate,
OrderTime: orderTime,
DividendsReturnedDate: returnedTime,
Region: &domain.RegionInfo{
RegionNumber: "",
RegionName: dividendsReturnedOrder.RegionName,
},
Goods: orderGoods,
Remarks: dividendsReturnedOrder.Remarks,
DividendStatus: domain.TO_BE_DIVIDENDED,
Remarks: "",
DividendStatus: 1,
DividendTime: time.Time{},
Org: organization,
Company: company,
CreatedAt: time.Now(),
DeletedAt: time.Time{},
UpdatedAt: time.Time{},
Operator: operator,
OperateTime: time.Now(),
}
if dividendsReturnedOrderSaved, err := dividendsReturnedOrderRepository.Save(newDividendsReturnedOrder); err != nil {
dividendsReturnedOrderImportFailed = append(dividendsReturnedOrderImportFailed, newDividendsReturnedOrder)
} else {
dividendsReturnedOrderImportSuccessfully = append(dividendsReturnedOrderImportSuccessfully, dividendsReturnedOrderSaved)
if _, err2 := dividendsReturnedOrderRepository.Save(newDividendsReturnedOrder); err2 != nil {
row := &domain.ImportInfo{
Error: application.ThrowError(application.INTERNAL_SERVER_ERROR, fmt.Sprintf("保存退货单数据失败:%s", err)),
LineNumbers: dividendsReturnedOrder.LineNumbers, // 错误影响的行
GoodLine: map[int]interface{}{},
}
errorDataList = append(errorDataList, row)
continue
}
}
if len(dividendsReturnedOrderImportFailed) == 0 {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
if len(errorDataList) <= 0 {
if err3 := transactionContext.CommitTransaction(); err3 != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err3.Error())
}
successDataCount = int64(rowCnt - len(failureDataList))
if successDataCount == int64(rowCnt) {
return map[string]interface{}{
"successCount": successDataCount,
"fail": nil,
}, nil
}
return dividendsReturnedOrderImportSuccessfully, nil
} else {
successDataCount = 0
// 错误记录处理
for _, errorData := range errorDataList {
if len(errorData.GoodLine) == 0 { // 订单错误
for _, line := range errorData.LineNumbers {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
} else if len(errorData.GoodLine) > 0 { // 订单产品错误
for line := range errorData.GoodLine {
var tmpRow []string
tmpRow = append(tmpRow, errorData.Error.Error()) // 错误信息
s := strconv.Itoa(line + 1)
tmpRow = append(tmpRow, s) // 行号
//tmpRow = append(tmpRow, importDividendsOrderCommand.DividendsOrderData[line]...) // 错误行数据
failureDataList = append(failureDataList, tmpRow)
}
}
}
return map[string]interface{}{
"successCount": successDataCount,
"fail": map[string]interface{}{
"tableHeader": tableHeader,
"tableData": failureDataList,
},
}, nil
}
return nil, nil
}
... ...
... ... @@ -50,6 +50,13 @@ type DividendsOrder struct {
Remarks string `json:"remarks"`
}
// ImportInfo 导入错误信息
type ImportInfo struct {
Error error
LineNumbers []int
GoodLine map[int]interface{}
}
type DividendsOrderRepository interface {
Save(dividendsOrder *DividendsOrder) (*DividendsOrder, error)
UpdateMany(dividendsOrders []*DividendsOrder) ([]*DividendsOrder, error)
... ...