animeic 1 year ago
parent
commit
90c86d5df2

+ 23 - 3
boxcost/api/bill-product-excel.go

@@ -3,6 +3,7 @@ package api
 import (
 	"box-cost/db/model"
 	"fmt"
+	"regexp"
 
 	_ "image/gif"
 	_ "image/jpeg"
@@ -81,7 +82,7 @@ func (b *ProductBillExcel) drawSubTitles() error {
 	drawLeft := func(rowIndex int, value string) error {
 		//左边1
 		left1Cell := fmt.Sprintf("A%d", rowIndex)
-		err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("G%d", rowIndex))
+		err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("F%d", rowIndex))
 		if err != nil {
 			return err
 		}
@@ -94,7 +95,7 @@ func (b *ProductBillExcel) drawSubTitles() error {
 	}
 
 	drawRight := func(rowIndex int, value string) error {
-		right1Cell := fmt.Sprintf("H%d", rowIndex)
+		right1Cell := fmt.Sprintf("G%d", rowIndex)
 		err = b.Excel.MergeCell(b.SheetName, right1Cell, fmt.Sprintf("I%d", rowIndex))
 		if err != nil {
 			return err
@@ -110,7 +111,7 @@ func (b *ProductBillExcel) drawSubTitles() error {
 	drawLall := func(rowIndex int, value string) error {
 		//左边1
 		left1Cell := fmt.Sprintf("A%d", rowIndex)
-		err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("I%d", rowIndex))
+		err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("F%d", rowIndex))
 		if err != nil {
 			return err
 		}
@@ -297,6 +298,24 @@ func (b *ProductBillExcel) drawSupplierRemark() error {
 
 }
 
+func (b *ProductBillExcel) drawRemark() error {
+	// 填备注
+	b.Row++
+	remarkTitleCell := fmt.Sprintf("A%d", b.Row)
+	b.Excel.SetCellValue(b.SheetName, remarkTitleCell, "备注:")
+	b.Row++
+
+	remarkContentScell := fmt.Sprintf("A%d", b.Row)
+	// 备注内容
+	reg := regexp.MustCompile(`\n`)
+	remarkRowNum := len(reg.FindAllString(b.Content.Remark, -1)) + 1
+	b.Row += remarkRowNum
+	remarkContentEcell := fmt.Sprintf("J%d", b.Row)
+	b.Excel.MergeCell(b.SheetName, remarkContentScell, remarkContentEcell)
+	b.Excel.SetCellValue(b.SheetName, remarkContentScell, b.Content.Remark)
+	return nil
+}
+
 func (b *ProductBillExcel) drawTableSignature() error {
 	b.Row += 2
 	// row := b.Row
@@ -365,6 +384,7 @@ func (b *ProductBillExcel) Draws() {
 		b.drawSupplierRemark()
 
 	}
+	b.drawRemark()
 	b.drawTableSignature()
 }
 

+ 49 - 7
boxcost/api/plan-summary-excel.go

@@ -2,6 +2,7 @@ package api
 
 import (
 	"fmt"
+	"strings"
 
 	"github.com/xuri/excelize/v2"
 )
@@ -19,7 +20,7 @@ type PlanSummaryExcel struct {
 func (b *PlanSummaryExcel) drawTitle() error {
 	b.Row++
 	startCell := fmt.Sprintf("A%d", b.Row)
-	err := b.Excel.MergeCell(b.SheetName, startCell, fmt.Sprintf("P%d", b.Row))
+	err := b.Excel.MergeCell(b.SheetName, startCell, fmt.Sprintf("S%d", b.Row))
 	if err != nil {
 		return err
 	}
@@ -127,11 +128,14 @@ func (b *PlanSummaryExcel) drawTableTitle() error {
 	drawCol("N", "下单单价")
 	drawCol("O", "预算金额")
 	drawCol("P", "实际金额")
+	drawCol("Q", "订单编号")
+	drawCol("R", "下单日期")
+	drawCol("S", "备注")
 	return nil
 }
 
 func (b *PlanSummaryExcel) drawRow(rowIndex int, values ...string) {
-	charas := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"}
+	charas := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S"}
 	for i, c := range charas {
 		v := ""
 		if i < len(values) {
@@ -168,7 +172,7 @@ func (b *PlanSummaryExcel) drawAllContent() error {
 				var perRealPrice float64 = 0.00
 				if len(comp.Stages) > 0 {
 					startRow := b.Row
-					// cates := map[string][]int{}
+					cates := map[string][]int{}
 					for _, stage := range comp.Stages {
 						matHeigth := fmt.Sprintf("%d", stage.BatchSizeHeight)
 						b.FormatToEmpty(&matHeigth)
@@ -247,14 +251,33 @@ func (b *PlanSummaryExcel) drawAllContent() error {
 								stageStatus = "未生成订单"
 							}
 						}
+						// 订单存在时,订单号和下单时间// 合并相同的订单,记录row方便合并
+						if len(stage.BillId) == 24 {
+							billFlag := fmt.Sprintf("%s_%s", splan.SerialNumber[stage.BillId], splan.CreateTimes[stage.BillId].Local().Format("2006-01-02"))
+							cates[billFlag] = append(cates[billFlag], b.Row)
+						}
 
-						b.drawRow(b.Row, "", "", stageType, stage.Name, orderCount, realCount, stageStatus, supplierName, fmt.Sprintf("%.3f元/%s", stage.Price, stage.Unit), stage.Norm, matHeigth, matWidth, unit, price, budgetPrice, realPrice)
+						b.drawRow(b.Row, "", "", stageType, stage.Name, orderCount, realCount, stageStatus, supplierName, fmt.Sprintf("%.3f元/%s", stage.Price, stage.Unit), stage.Norm,
+							matHeigth, matWidth, unit, price, budgetPrice, realPrice, "-", "-", stage.Remark)
 						// if stage.SupplierInfo != nil {
 						// 	cates[stage.SupplierInfo.Name] = append(cates[stage.SupplierInfo.Name], b.Row)
 
 						// }
 						b.Row++
 					}
+					for billFlag, cate := range cates {
+						billInfo := strings.Split(billFlag, "_")
+
+						if len(billInfo) == 2 {
+							mergeStartRow := cate[0]
+							mergeEndRow := cate[len(cate)-1]
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("Q%d", mergeStartRow), fmt.Sprintf("Q%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("Q%d", mergeEndRow), billInfo[0])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("R%d", mergeStartRow), fmt.Sprintf("R%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("R%d", mergeEndRow), billInfo[1])
+						}
+
+					}
 
 					// for supplierName, cate := range cates {
 					// 	mergeStartRow := cate[0]
@@ -345,7 +368,7 @@ func (b *PlanSummaryExcel) drawSupplierContent() error {
 				var perRealPrice float64 = 0.00
 				if len(comp.Stages) > 0 {
 					startRow := 0
-					// cates := map[string][]int{}
+					cates := map[string][]int{}
 					for _, stage := range comp.Stages {
 						if stage.SupplierInfo != nil {
 							if b.Content.SupplierId == stage.SupplierInfo.Id {
@@ -433,8 +456,13 @@ func (b *PlanSummaryExcel) drawSupplierContent() error {
 										stageStatus = "未生成订单"
 									}
 								}
+								if len(stage.BillId) == 24 {
+									billFlag := fmt.Sprintf("%s_%s", splan.SerialNumber[stage.BillId], splan.CreateTimes[stage.BillId].Local().Format("2006-01-02"))
+									cates[billFlag] = append(cates[billFlag], b.Row)
+								}
 
-								b.drawRow(b.Row, "", "", stageType, stage.Name, orderCount, realCount, stageStatus, supplierName, fmt.Sprintf("%.3f元/%s", stage.Price, stage.Unit), stage.Norm, matHeigth, matWidth, unit, price, budgetPrice, realPrice)
+								b.drawRow(b.Row, "", "", stageType, stage.Name, orderCount, realCount, stageStatus, supplierName, fmt.Sprintf("%.3f元/%s", stage.Price, stage.Unit),
+									stage.Norm, matHeigth, matWidth, unit, price, budgetPrice, realPrice, "-", "-", stage.Remark)
 								// if stage.SupplierInfo != nil {
 								// 	cates[stage.SupplierInfo.Name] = append(cates[stage.SupplierInfo.Name], b.Row)
 
@@ -445,6 +473,18 @@ func (b *PlanSummaryExcel) drawSupplierContent() error {
 						}
 					}
 
+					for billFlag, cate := range cates {
+						billInfo := strings.Split(billFlag, "_")
+						if len(billInfo) == 2 {
+							mergeStartRow := cate[0]
+							mergeEndRow := cate[len(cate)-1]
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("Q%d", mergeStartRow), fmt.Sprintf("Q%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("Q%d", mergeEndRow), billInfo[0])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("R%d", mergeStartRow), fmt.Sprintf("R%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("R%d", mergeEndRow), billInfo[1])
+						}
+					}
+
 					// 合并同一供应商名
 					// for supplierName, cate := range cates {
 					// 	mergeStartRow := cate[0]
@@ -569,7 +609,9 @@ func NewPlanSummaryExcel(f *excelize.File) *PlanSummaryExcel {
 	f.SetColWidth(b.SheetName, "H", "H", 25)
 	f.SetColWidth(b.SheetName, "I", "L", 16)
 	f.SetColWidth(b.SheetName, "M", "M", 10)
-	f.SetColWidth(b.SheetName, "N", "P", 16)
+	f.SetColWidth(b.SheetName, "N", "P", 13)
+	f.SetColWidth(b.SheetName, "Q", "R", 16)
+	f.SetColWidth(b.SheetName, "S", "S", 20)
 	f.SetPageMargins(b.SheetName, excelize.PageMarginTop(0), excelize.PageMarginLeft(0), excelize.PageMarginRight(0))
 	return b
 }

+ 8 - 5
boxcost/api/plan.go

@@ -1056,6 +1056,7 @@ func GetProductPlan(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	}
 
 	billStates := map[string]string{}
+	billSerialNumber := map[string]string{}
 	billIsSend := map[string]bool{}
 	billReviewed := map[string]int32{}
 	billIsAck := map[string]bool{}
@@ -1085,6 +1086,7 @@ func GetProductPlan(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 							Project:     []string{"status", "isSend", "reviewed", "isAck", "serialNumber", "remark"}})
 						if ok {
 							billStates[stage.BillId] = state["status"].(string)
+							billSerialNumber[stage.BillId] = state["serialNumber"].(string)
 							if v, ok := state["isSend"]; ok {
 								billIsSend[stage.BillId] = v.(bool)
 
@@ -1112,11 +1114,12 @@ func GetProductPlan(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	}
 
 	return map[string]interface{}{
-		"plan":         plan,
-		"billStates":   billStates,
-		"billIsSend":   billIsSend,
-		"billReviewed": billReviewed,
-		"billIsAck":    billIsAck,
+		"plan":             plan,
+		"billStates":       billStates,
+		"billIsSend":       billIsSend,
+		"billReviewed":     billReviewed,
+		"billIsAck":        billIsAck,
+		"billSerialNumber": billSerialNumber,
 	}, nil
 }
 

+ 32 - 26
boxcost/api/summary-sample-excel.go

@@ -148,27 +148,31 @@ func (b *SummarySampleExcel) drawAllContent() error {
 						}
 
 						fmt.Println(stageStatus)
-						createTime := splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
 						deliveryTime := stage.DeliveryTime.Local().Format("2006-01-02")
 						stageNmae := fmt.Sprintf("%s %s", statusMark, stage.Name)
-
+						createTime := "-"
+						if len(stage.BillId) == 24 {
+							createTime = splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
+							cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
+						}
 						b.drawRow(b.Row, "", "", "", createTime, deliveryTime, stageNmae, "")
 
-						cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
 						b.Row++
 					}
 
 					for stageInfo, cate := range cates {
 						sf := strings.Split(stageInfo, ",")
-						fmt.Println(sf)
-						mergeStartRow := cate[0]
-						mergeEndRow := cate[len(cate)-1]
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
+						if len(sf) == 3 {
+							fmt.Println(sf)
+							mergeStartRow := cate[0]
+							mergeEndRow := cate[len(cate)-1]
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
+						}
 
 					}
 
@@ -283,13 +287,14 @@ func (b *SummarySampleExcel) drawSupplierContent() error {
 									}
 								}
 								fmt.Println(stageStatus)
-								createTime := splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
 								deliveryTime := stage.DeliveryTime.Local().Format("2006-01-02")
 								stageNmae := fmt.Sprintf("%s %s", statusMark, stage.Name)
-
+								createTime := "-"
+								if len(stage.BillId) == 24 {
+									createTime = splan.CreateTimes[stage.BillId].Local().Format("2006-01-02")
+									cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
+								}
 								b.drawRow(b.Row, "", "", "", createTime, deliveryTime, stageNmae, "")
-
-								cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)] = append(cates[fmt.Sprintf("%s,%s,%s", createTime, deliveryTime, stageNmae)], b.Row)
 								b.Row++
 							}
 
@@ -298,16 +303,17 @@ func (b *SummarySampleExcel) drawSupplierContent() error {
 
 					for stageInfo, cate := range cates {
 						sf := strings.Split(stageInfo, ",")
-						fmt.Println(sf)
-						mergeStartRow := cate[0]
-						mergeEndRow := cate[len(cate)-1]
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
-						b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
-						b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
-
+						if len(sf) == 3 {
+							fmt.Println(sf)
+							mergeStartRow := cate[0]
+							mergeEndRow := cate[len(cate)-1]
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("D%d", mergeStartRow), fmt.Sprintf("D%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("D%d", mergeEndRow), sf[0])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("E%d", mergeStartRow), fmt.Sprintf("E%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("E%d", mergeEndRow), sf[1])
+							b.Excel.MergeCell(b.SheetName, fmt.Sprintf("F%d", mergeStartRow), fmt.Sprintf("F%d", mergeEndRow))
+							b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("F%d", mergeEndRow), sf[2])
+						}
 					}
 
 					if startRow != 0 {

+ 18 - 12
boxcost/api/summary.go

@@ -24,14 +24,16 @@ func Summary(r *GinRouter) {
 type SupplierPlanSummary struct {
 	Plans      []*PlanSummary
 	SupplierId primitive.ObjectID
+	ApiSession *ApiSession
 }
 type PlanSummary struct {
-	Plan        *model.ProductPlan
-	IsSend      map[string]bool
-	IsAck       map[string]bool
-	Reviewed    map[string]int32
-	State       map[string]string
-	CreateTimes map[string]time.Time
+	Plan         *model.ProductPlan
+	IsSend       map[string]bool
+	IsAck        map[string]bool
+	Reviewed     map[string]int32
+	State        map[string]string
+	CreateTimes  map[string]time.Time
+	SerialNumber map[string]string
 }
 
 // /summary/download?planIds=id1,id2&supplierId=xxx
@@ -84,6 +86,7 @@ func SummaryDownload(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	planSummaryExcel.Content = &SupplierPlanSummary{
 		Plans:      summaryPlans,
 		SupplierId: supplierId,
+		ApiSession: apictx,
 	}
 	// 绘制表格
 	planSummaryExcel.Draws()
@@ -177,6 +180,7 @@ func filter(arr []string, f func(string) bool) []string {
 
 func GetPlanStatus(plan *model.ProductPlan, apictx *ApiSession) *PlanSummary {
 	billStates := map[string]string{}
+	billSerialNumber := map[string]string{}
 	billIsSend := map[string]bool{}
 	billReviewed := map[string]int32{}
 	billIsAck := map[string]bool{}
@@ -207,6 +211,7 @@ func GetPlanStatus(plan *model.ProductPlan, apictx *ApiSession) *PlanSummary {
 							Project:     []string{"status", "isSend", "reviewed", "isAck", "serialNumber", "remark", "createTime"}})
 						if ok {
 							billStates[stage.BillId] = state["status"].(string)
+							billSerialNumber[stage.BillId] = state["serialNumber"].(string)
 							if v, ok := state["isSend"]; ok {
 								billIsSend[stage.BillId] = v.(bool)
 
@@ -237,11 +242,12 @@ func GetPlanStatus(plan *model.ProductPlan, apictx *ApiSession) *PlanSummary {
 		}
 	}
 	return &PlanSummary{
-		Plan:        plan,
-		IsSend:      billIsSend,
-		IsAck:       billIsAck,
-		Reviewed:    billReviewed,
-		State:       billStates,
-		CreateTimes: billCreateTimes,
+		Plan:         plan,
+		IsSend:       billIsSend,
+		IsAck:        billIsAck,
+		Reviewed:     billReviewed,
+		State:        billStates,
+		CreateTimes:  billCreateTimes,
+		SerialNumber: billSerialNumber,
 	}
 }