|
@@ -22,6 +22,8 @@ import (
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
)
|
|
|
|
|
|
+// TODO 下载代码重复提取
|
|
|
+
|
|
|
// 生产计划管理
|
|
|
func ProductPlan(r *GinRouter) {
|
|
|
|
|
@@ -44,6 +46,9 @@ func ProductPlan(r *GinRouter) {
|
|
|
// r.GET("/bill/plan/download", DownLoadCompBills)
|
|
|
r.GET("/bill/plan/download", DownLoadPlanBills)
|
|
|
|
|
|
+ r.GET("/bill/comp/download", DownLoadCompBills)
|
|
|
+ r.GET("/bill/comp/downloadPdf", DownLoadCompBillsPdf)
|
|
|
+
|
|
|
r.GET("/bill/plan/downloadPdf", DownLoadPlanBillsPdf)
|
|
|
|
|
|
// 生产成本表
|
|
@@ -230,12 +235,17 @@ func DownLoadPlanCost(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
|
|
|
}
|
|
|
|
|
|
-func DownLoadPlanBills(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
+func DownLoadCompBills(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
_planId := c.Query("id")
|
|
|
- planId, err := primitive.ObjectIDFromHex(_planId)
|
|
|
- if err != nil {
|
|
|
+ compId := c.Query("compId")
|
|
|
+ planId, _ := primitive.ObjectIDFromHex(_planId)
|
|
|
+ if planId.IsZero() {
|
|
|
return nil, errors.New("planId错误")
|
|
|
}
|
|
|
+ if len(compId) < 1 {
|
|
|
+ return nil, errors.New("planId错误")
|
|
|
+ }
|
|
|
+
|
|
|
plan := model.ProductPlan{}
|
|
|
found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
CollectName: repo.CollectionProductPlan,
|
|
@@ -244,30 +254,35 @@ func DownLoadPlanBills(c *gin.Context, apictx *ApiSession) (interface{}, error)
|
|
|
if !found || err != nil {
|
|
|
return nil, errors.New("数据未找到")
|
|
|
}
|
|
|
- // 获取所有stages单据id
|
|
|
- billIds := make([]string, 0)
|
|
|
+ compBills := make([]string, 0)
|
|
|
+ compNameId := ""
|
|
|
for _, comp := range plan.Pack.Components {
|
|
|
if comp.Id == "" || len(comp.Stages) == 0 {
|
|
|
continue
|
|
|
}
|
|
|
- for _, stage := range comp.Stages {
|
|
|
- billId, _ := primitive.ObjectIDFromHex(stage.BillId)
|
|
|
- if !billId.IsZero() {
|
|
|
- billIds = append(billIds, fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
+ if compId == comp.Id {
|
|
|
+ compNameId = fmt.Sprintf("%s_%s", comp.Name, compId)
|
|
|
+ for _, stage := range comp.Stages {
|
|
|
+ billId, _ := primitive.ObjectIDFromHex(stage.BillId)
|
|
|
+ if !billId.IsZero() {
|
|
|
+ compBills = append(compBills, fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
- // 去重单据号
|
|
|
- typeBillIds := removeDuplicationSort(billIds)
|
|
|
+ if len(compBills) < 1 {
|
|
|
+ return nil, errors.New("数据未找到")
|
|
|
+ }
|
|
|
+ companyName := getCompanyName(apictx)
|
|
|
+
|
|
|
+ typeBillIds := removeDuplicationSort(compBills)
|
|
|
if len(typeBillIds) < 1 {
|
|
|
return nil, errors.New("未找到单据信息")
|
|
|
}
|
|
|
f := excelize.NewFile()
|
|
|
f.SetDefaultFont("宋体")
|
|
|
flagIndex := -1
|
|
|
- companyName := getCompanyName(apictx)
|
|
|
-
|
|
|
// 采购 加工 加工-印刷 加工-覆膜 成品采购
|
|
|
typeRows := []int{0, 0, 0, 0, 0}
|
|
|
for _, tId := range typeBillIds {
|
|
@@ -404,25 +419,23 @@ func DownLoadPlanBills(c *gin.Context, apictx *ApiSession) (interface{}, error)
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
// 设置活跃sheet
|
|
|
f.SetActiveSheet(flagIndex)
|
|
|
// 删除默认Sheet1
|
|
|
f.DeleteSheet("Sheet1")
|
|
|
|
|
|
c.Header("Content-Type", "application/octet-stream")
|
|
|
- c.Header("Content-Disposition", "attachment; filename="+"bill.xlsx")
|
|
|
+ c.Header("Content-Disposition", "attachment; filename="+fmt.Sprintf("%s.xlsx", compNameId))
|
|
|
c.Header("Content-Transfer-Encoding", "binary")
|
|
|
|
|
|
- err = f.Write(c.Writer)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
+ f.Write(c.Writer)
|
|
|
|
|
|
return nil, nil
|
|
|
+
|
|
|
}
|
|
|
|
|
|
-// todo old 功能确定后删除
|
|
|
-func DownLoadPlanBillsBack(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
+func DownLoadPlanBills(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
_planId := c.Query("id")
|
|
|
planId, err := primitive.ObjectIDFromHex(_planId)
|
|
|
if err != nil {
|
|
@@ -436,46 +449,78 @@ func DownLoadPlanBillsBack(c *gin.Context, apictx *ApiSession) (interface{}, err
|
|
|
if !found || err != nil {
|
|
|
return nil, errors.New("数据未找到")
|
|
|
}
|
|
|
+ // 获取组件中的单据并分工序排列
|
|
|
+
|
|
|
// 获取所有stages单据id
|
|
|
- billIds := make([]string, 0)
|
|
|
+ // billIds := make([]string, 0)
|
|
|
+ type billIds []string
|
|
|
+ compBillsMap := make(map[string]billIds, 0)
|
|
|
for _, comp := range plan.Pack.Components {
|
|
|
if comp.Id == "" || len(comp.Stages) == 0 {
|
|
|
continue
|
|
|
}
|
|
|
+ // 唯一组价名,拼上id是因为防止可能有多个相同组件名
|
|
|
+ compNameId := fmt.Sprintf("%s_%s", comp.Name, comp.Id)
|
|
|
for _, stage := range comp.Stages {
|
|
|
billId, _ := primitive.ObjectIDFromHex(stage.BillId)
|
|
|
if !billId.IsZero() {
|
|
|
- billIds = append(billIds, fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
+ compBillsMap[compNameId] = append(compBillsMap[compNameId], fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
+ // billIds = append(billIds, fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- // 去重单据号
|
|
|
- typeBillIds := removeDuplicationSort(billIds)
|
|
|
- if len(typeBillIds) < 1 {
|
|
|
- return nil, errors.New("未找到单据信息")
|
|
|
+ if len(compBillsMap) < 1 {
|
|
|
+ return nil, errors.New("数据未找到")
|
|
|
}
|
|
|
- f := excelize.NewFile()
|
|
|
- index := f.NewSheet("Sheet1")
|
|
|
- f.SetActiveSheet(index)
|
|
|
- f.SetDefaultFont("宋体")
|
|
|
+
|
|
|
companyName := getCompanyName(apictx)
|
|
|
|
|
|
- row := 0
|
|
|
- for _, tId := range typeBillIds {
|
|
|
- tidArr := strings.Split(tId, "_")
|
|
|
+ _planName := plan.Name
|
|
|
+ r := regexp.MustCompile(`/`)
|
|
|
+ planName := r.ReplaceAllString(_planName, `&`)
|
|
|
+ // fmt.Println(planName)
|
|
|
+ // 打包pdf的缓存目录
|
|
|
+ saveTmpDir := fmt.Sprintf("tmp1/excel/%s", planName)
|
|
|
|
|
|
- var billExcel IExcel
|
|
|
- // 采购
|
|
|
- billId, _ := primitive.ObjectIDFromHex(tidArr[1])
|
|
|
- if tidArr[0] == "1" {
|
|
|
- purchase := model.PurchaseBill{}
|
|
|
- found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
- CollectName: repo.CollectionBillPurchase,
|
|
|
- Query: repo.Map{"_id": billId},
|
|
|
- }, &purchase)
|
|
|
- if found {
|
|
|
+ if isExistDir(saveTmpDir) {
|
|
|
+ os.RemoveAll(saveTmpDir)
|
|
|
+ }
|
|
|
+
|
|
|
+ for compNameId, billIds := range compBillsMap {
|
|
|
+ // 去重单据号
|
|
|
+ typeBillIds := removeDuplicationSort(billIds)
|
|
|
+ if len(typeBillIds) < 1 {
|
|
|
+ return nil, errors.New("未找到单据信息")
|
|
|
+ }
|
|
|
+ f := excelize.NewFile()
|
|
|
+ f.SetDefaultFont("宋体")
|
|
|
+ flagIndex := -1
|
|
|
+ // 采购 加工 加工-印刷 加工-覆膜 成品采购
|
|
|
+ typeRows := []int{0, 0, 0, 0, 0}
|
|
|
+ for _, tId := range typeBillIds {
|
|
|
+ tidArr := strings.Split(tId, "_")
|
|
|
+ var billExcel IExcel
|
|
|
+ // 采购
|
|
|
+ billId, _ := primitive.ObjectIDFromHex(tidArr[1])
|
|
|
+ if tidArr[0] == "1" {
|
|
|
+ purchase := model.PurchaseBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillPurchase,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &purchase)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ sheetName := "采购单"
|
|
|
+ index := f.NewSheet(sheetName)
|
|
|
+ if flagIndex < 0 {
|
|
|
+ flagIndex = index
|
|
|
+ }
|
|
|
+ // index := f.NewSheet("采购单")
|
|
|
+ // f.SetActiveSheet(index)
|
|
|
billExcel = NewPurchaseBill(f)
|
|
|
+ billExcel.SetSheetName(sheetName)
|
|
|
if purchase.Reviewed == 1 {
|
|
|
if len(purchase.SignUsers) > 0 {
|
|
|
signs := []*model.Signature{}
|
|
@@ -490,18 +535,34 @@ func DownLoadPlanBillsBack(c *gin.Context, apictx *ApiSession) (interface{}, err
|
|
|
}
|
|
|
billExcel.SetContent(&purchase)
|
|
|
billExcel.SetTitle(fmt.Sprintf("%s原材料采购单", companyName))
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
- // 工艺
|
|
|
- if tidArr[0] == "2" {
|
|
|
- produce := model.ProduceBill{}
|
|
|
- found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
- CollectName: repo.CollectionBillProduce,
|
|
|
- Query: repo.Map{"_id": billId},
|
|
|
- }, &produce)
|
|
|
- if found {
|
|
|
+ billExcel.SetRow(typeRows[0])
|
|
|
+ billExcel.Draws()
|
|
|
+ typeRows[0] = billExcel.GetRow() + 5
|
|
|
+
|
|
|
+ }
|
|
|
+ // 工艺
|
|
|
+ if tidArr[0] == "2" {
|
|
|
+ produce := model.ProduceBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillProduce,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &produce)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ sheetName := "加工单"
|
|
|
+ if produce.IsPrint {
|
|
|
+ sheetName = "加工单-印刷"
|
|
|
+ } else if produce.IsLam {
|
|
|
+ sheetName = "加工单-覆膜"
|
|
|
+ }
|
|
|
+ index := f.NewSheet(sheetName)
|
|
|
+ if flagIndex < 0 {
|
|
|
+ flagIndex = index
|
|
|
+ }
|
|
|
billExcel = NewProduceBill(f)
|
|
|
+ billExcel.SetSheetName(sheetName)
|
|
|
if produce.Reviewed == 1 {
|
|
|
if len(produce.SignUsers) > 0 {
|
|
|
signs := []*model.Signature{}
|
|
@@ -516,18 +577,40 @@ func DownLoadPlanBillsBack(c *gin.Context, apictx *ApiSession) (interface{}, err
|
|
|
}
|
|
|
billExcel.SetContent(&produce)
|
|
|
billExcel.SetTitle(fmt.Sprintf("%s加工单", companyName))
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
- // 成品采购
|
|
|
- if tidArr[0] == "3" {
|
|
|
- product := model.ProductBill{}
|
|
|
- found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
- CollectName: repo.CollectionBillProduct,
|
|
|
- Query: repo.Map{"_id": billId},
|
|
|
- }, &product)
|
|
|
- if found {
|
|
|
+ if produce.IsPrint {
|
|
|
+ billExcel.SetRow(typeRows[2])
|
|
|
+ billExcel.Draws()
|
|
|
+ typeRows[2] = billExcel.GetRow() + 5
|
|
|
+ } else if produce.IsLam {
|
|
|
+ billExcel.SetRow(typeRows[3])
|
|
|
+ billExcel.Draws()
|
|
|
+ typeRows[3] = billExcel.GetRow() + 5
|
|
|
+ } else {
|
|
|
+ billExcel.SetRow(typeRows[1])
|
|
|
+ billExcel.Draws()
|
|
|
+ typeRows[1] = billExcel.GetRow() + 5
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ // 成品采购
|
|
|
+ if tidArr[0] == "3" {
|
|
|
+ product := model.ProductBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillProduct,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &product)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ sheetName := "成品采购单"
|
|
|
+ index := f.NewSheet(sheetName)
|
|
|
+ if flagIndex < 0 {
|
|
|
+ flagIndex = index
|
|
|
+ }
|
|
|
billExcel = NewProductBill(f)
|
|
|
+ billExcel.SetSheetName(sheetName)
|
|
|
if product.Reviewed == 1 {
|
|
|
if len(product.SignUsers) > 0 {
|
|
|
signs := []*model.Signature{}
|
|
@@ -542,26 +625,73 @@ func DownLoadPlanBillsBack(c *gin.Context, apictx *ApiSession) (interface{}, err
|
|
|
}
|
|
|
billExcel.SetContent(&product)
|
|
|
billExcel.SetTitle(companyName)
|
|
|
+
|
|
|
+ billExcel.SetRow(typeRows[4])
|
|
|
+ billExcel.Draws()
|
|
|
+ typeRows[4] = billExcel.GetRow() + 5
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
- if billExcel == nil {
|
|
|
- continue
|
|
|
+
|
|
|
+ // 设置活跃sheet
|
|
|
+ f.SetActiveSheet(flagIndex)
|
|
|
+ // 删除默认Sheet1
|
|
|
+ f.DeleteSheet("Sheet1")
|
|
|
+
|
|
|
+ buf, _ := f.WriteToBuffer()
|
|
|
+
|
|
|
+ targeEXcelName := fmt.Sprintf("%s.xlsx", compNameId)
|
|
|
+
|
|
|
+ err := savePdfToTmp(saveTmpDir, targeEXcelName, buf.Bytes())
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("保存文件失败!")
|
|
|
+ return nil, err
|
|
|
}
|
|
|
- billExcel.SetRow(row)
|
|
|
- billExcel.Draws()
|
|
|
- row = billExcel.GetRow() + 5
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
c.Header("Content-Type", "application/octet-stream")
|
|
|
- c.Header("Content-Disposition", "attachment; filename="+"bill.xlsx")
|
|
|
+ c.Header("Content-Disposition", "attachment; filename="+fmt.Sprintf("%s-execl.zip", planName))
|
|
|
c.Header("Content-Transfer-Encoding", "binary")
|
|
|
|
|
|
- err = f.Write(c.Writer)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
+ archive := zip.NewWriter(c.Writer)
|
|
|
+ defer archive.Close()
|
|
|
+ // 遍历路径信息
|
|
|
+ filepath.Walk(saveTmpDir, func(path string, info os.FileInfo, _ error) error {
|
|
|
+
|
|
|
+ // 如果是源路径,提前进行下一个遍历
|
|
|
+ if path == saveTmpDir {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取:文件头信息
|
|
|
+ header, _ := zip.FileInfoHeader(info)
|
|
|
+ header.Name = strings.TrimPrefix(path, saveTmpDir+`/`)
|
|
|
+
|
|
|
+ // 判断:文件是不是文件夹
|
|
|
+ if info.IsDir() {
|
|
|
+ header.Name += `/`
|
|
|
+ } else {
|
|
|
+ // 设置:zip的文件压缩算法
|
|
|
+ header.Method = zip.Deflate
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建:压缩包头部信息
|
|
|
+ writer, _ := archive.CreateHeader(header)
|
|
|
+ if !info.IsDir() {
|
|
|
+ file, _ := os.Open(path)
|
|
|
+ defer file.Close()
|
|
|
+ io.Copy(writer, file)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+
|
|
|
+ // 删除缓存目录
|
|
|
+ os.RemoveAll(saveTmpDir)
|
|
|
|
|
|
return nil, nil
|
|
|
+ // http://127.0.0.1:8888/boxcost/bill/plan/download?id=652206412617b328da71655e
|
|
|
+ // http://127.0.0.1:8888/boxcost/bill/comp/download?id=652206412617b328da71655e&compId=1677034398070
|
|
|
+ // http://127.0.0.1:8888/boxcost/bill/comp/downloadPdf?id=652206412617b328da71655e&compId=1677034398070
|
|
|
}
|
|
|
|
|
|
func DownLoadPlanBillsPdf(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
@@ -592,12 +722,11 @@ func DownLoadPlanBillsPdf(c *gin.Context, apictx *ApiSession) (interface{}, erro
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+ if len(billIds) < 1 {
|
|
|
+ return nil, errors.New("数据未找到")
|
|
|
+ }
|
|
|
// 去重单据号
|
|
|
typeBillIds := removeDuplicationSort(billIds)
|
|
|
- if len(typeBillIds) < 1 {
|
|
|
- return nil, errors.New("未找到单据信息")
|
|
|
- }
|
|
|
-
|
|
|
companyName := getCompanyName(apictx)
|
|
|
_planName := plan.Name
|
|
|
r := regexp.MustCompile(`/`)
|
|
@@ -855,6 +984,233 @@ func toPdfAndSaveTask(buf *bytes.Buffer, toPdfAddr, saveTmpDir, targetPdfName st
|
|
|
wg.Done()
|
|
|
}
|
|
|
|
|
|
+func DownLoadCompBillsPdf(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
+ _planId := c.Query("id")
|
|
|
+ compId := c.Query("compId")
|
|
|
+ planId, _ := primitive.ObjectIDFromHex(_planId)
|
|
|
+ if planId.IsZero() {
|
|
|
+ return nil, errors.New("planId错误")
|
|
|
+ }
|
|
|
+ if len(compId) < 1 {
|
|
|
+ return nil, errors.New("compId错误")
|
|
|
+ }
|
|
|
+ plan := model.ProductPlan{}
|
|
|
+ found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionProductPlan,
|
|
|
+ Query: repo.Map{"_id": planId},
|
|
|
+ }, &plan)
|
|
|
+ if !found || err != nil {
|
|
|
+ return nil, errors.New("数据未找到")
|
|
|
+ }
|
|
|
+ // 获取所有stages单据id
|
|
|
+ billIds := make([]string, 0)
|
|
|
+ compNameId := ""
|
|
|
+ for _, comp := range plan.Pack.Components {
|
|
|
+ if comp.Id == "" || len(comp.Stages) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if comp.Id == compId {
|
|
|
+ compNameId = fmt.Sprintf("%s_%s", comp.Name, comp.Id)
|
|
|
+ for _, stage := range comp.Stages {
|
|
|
+ billId, _ := primitive.ObjectIDFromHex(stage.BillId)
|
|
|
+ if !billId.IsZero() {
|
|
|
+ billIds = append(billIds, fmt.Sprintf("%d_%s", stage.BillType, stage.BillId))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ if len(billIds) < 1 {
|
|
|
+ return nil, errors.New("数据未找到")
|
|
|
+ }
|
|
|
+ // 去重单据号
|
|
|
+ typeBillIds := removeDuplicationSort(billIds)
|
|
|
+ companyName := getCompanyName(apictx)
|
|
|
+ _planName := plan.Name
|
|
|
+ r := regexp.MustCompile(`/`)
|
|
|
+ planName := r.ReplaceAllString(_planName, `&`)
|
|
|
+ // fmt.Println(planName)
|
|
|
+ // 打包pdf的缓存目录
|
|
|
+ saveTmpDir := fmt.Sprintf("tmp1/%s/%s", planName, compNameId)
|
|
|
+
|
|
|
+ if isExistDir(saveTmpDir) {
|
|
|
+ os.RemoveAll(saveTmpDir)
|
|
|
+ }
|
|
|
+ // 记录文件数量
|
|
|
+ var wg sync.WaitGroup
|
|
|
+ c1 := make(chan int)
|
|
|
+ for _, tId := range typeBillIds {
|
|
|
+ productName := ""
|
|
|
+ supplierName := ""
|
|
|
+ serialNumber := ""
|
|
|
+ f := excelize.NewFile()
|
|
|
+ index := f.NewSheet("Sheet1")
|
|
|
+ f.SetActiveSheet(index)
|
|
|
+ f.SetDefaultFont("宋体")
|
|
|
+
|
|
|
+ tidArr := strings.Split(tId, "_")
|
|
|
+ var billExcel IExcel
|
|
|
+ // 采购
|
|
|
+ billId, _ := primitive.ObjectIDFromHex(tidArr[1])
|
|
|
+ if tidArr[0] == "1" {
|
|
|
+ purchase := model.PurchaseBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillPurchase,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &purchase)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ billExcel = NewPurchaseBill(f)
|
|
|
+ if purchase.Reviewed == 1 {
|
|
|
+ if len(purchase.SignUsers) > 0 {
|
|
|
+ signs := []*model.Signature{}
|
|
|
+ repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
|
|
|
+ CollectName: repo.CollectionSignature,
|
|
|
+ Query: repo.Map{"_id": bson.M{"$in": purchase.SignUsers}},
|
|
|
+ Sort: bson.M{"sort": 1},
|
|
|
+ }, &signs)
|
|
|
+ billExcel.SetSignatures(signs)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ productName = purchase.ProductName
|
|
|
+ supplierName = purchase.Supplier
|
|
|
+ serialNumber = purchase.SerialNumber
|
|
|
+ billExcel.SetContent(&purchase)
|
|
|
+ billExcel.SetTitle(fmt.Sprintf("%s原材料采购单", companyName))
|
|
|
+
|
|
|
+ }
|
|
|
+ // 工艺
|
|
|
+ if tidArr[0] == "2" {
|
|
|
+ produce := model.ProduceBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillProduce,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &produce)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ billExcel = NewProduceBill(f)
|
|
|
+ if produce.Reviewed == 1 {
|
|
|
+ if len(produce.SignUsers) > 0 {
|
|
|
+ signs := []*model.Signature{}
|
|
|
+ repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
|
|
|
+ CollectName: repo.CollectionSignature,
|
|
|
+ Query: repo.Map{"_id": bson.M{"$in": produce.SignUsers}},
|
|
|
+ Sort: bson.M{"sort": 1},
|
|
|
+ }, &signs)
|
|
|
+ billExcel.SetSignatures(signs)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ productName = produce.ProductName
|
|
|
+ supplierName = produce.Supplier
|
|
|
+ serialNumber = produce.SerialNumber
|
|
|
+ billExcel.SetContent(&produce)
|
|
|
+ billExcel.SetTitle(fmt.Sprintf("%s加工单", companyName))
|
|
|
+
|
|
|
+ }
|
|
|
+ // 成品采购
|
|
|
+ if tidArr[0] == "3" {
|
|
|
+ product := model.ProductBill{}
|
|
|
+ found, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
|
|
|
+ CollectName: repo.CollectionBillProduct,
|
|
|
+ Query: repo.Map{"_id": billId},
|
|
|
+ }, &product)
|
|
|
+ if !found {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ billExcel = NewProductBill(f)
|
|
|
+ if product.Reviewed == 1 {
|
|
|
+ if len(product.SignUsers) > 0 {
|
|
|
+ signs := []*model.Signature{}
|
|
|
+ repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
|
|
|
+ CollectName: repo.CollectionSignature,
|
|
|
+ Query: repo.Map{"_id": bson.M{"$in": product.SignUsers}},
|
|
|
+ Sort: bson.M{"sort": 1},
|
|
|
+ }, &signs)
|
|
|
+ billExcel.SetSignatures(signs)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ productName = product.ProductName
|
|
|
+ supplierName = product.Supplier
|
|
|
+ serialNumber = product.SerialNumber
|
|
|
+ billExcel.SetContent(&product)
|
|
|
+ billExcel.SetTitle(companyName)
|
|
|
+ }
|
|
|
+ billExcel.SetIsPdf("true")
|
|
|
+ billExcel.Draws()
|
|
|
+ buf, _ := f.WriteToBuffer()
|
|
|
+
|
|
|
+ // r := regexp.MustCompile(`/`)
|
|
|
+ _productName := r.ReplaceAllString(productName, `&`)
|
|
|
+ _supplierName := r.ReplaceAllString(supplierName, `&`)
|
|
|
+ targePdfName := fmt.Sprintf("%s-%s-%s.pdf", _supplierName, _productName, serialNumber)
|
|
|
+ // fmt.Println(targePdfName)
|
|
|
+
|
|
|
+ wg.Add(1)
|
|
|
+ go toPdfAndSaveTask(buf, apictx.Svc.Conf.PdfApiAddr, saveTmpDir, targePdfName, c1, &wg)
|
|
|
+
|
|
|
+ }
|
|
|
+ go func() {
|
|
|
+ // 等待所有goroutine
|
|
|
+ wg.Wait()
|
|
|
+ // 关闭channel
|
|
|
+ close(c1)
|
|
|
+ }()
|
|
|
+ // channel关闭后结束后停止遍历接收channel中的值
|
|
|
+ for n := range c1 {
|
|
|
+ if n == -1 {
|
|
|
+ return nil, errors.New("下载失败,请重试")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ c.Header("Content-Type", "application/octet-stream")
|
|
|
+ c.Header("Content-Disposition", "attachment; filename="+fmt.Sprintf("%s.zip", compNameId))
|
|
|
+ c.Header("Content-Transfer-Encoding", "binary")
|
|
|
+
|
|
|
+ archive := zip.NewWriter(c.Writer)
|
|
|
+ defer archive.Close()
|
|
|
+ // 遍历路径信息
|
|
|
+ filepath.Walk(saveTmpDir, func(path string, info os.FileInfo, _ error) error {
|
|
|
+
|
|
|
+ // 如果是源路径,提前进行下一个遍历
|
|
|
+ if path == saveTmpDir {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取:文件头信息
|
|
|
+ header, _ := zip.FileInfoHeader(info)
|
|
|
+ header.Name = strings.TrimPrefix(path, saveTmpDir+`/`)
|
|
|
+
|
|
|
+ // 判断:文件是不是文件夹
|
|
|
+ if info.IsDir() {
|
|
|
+ header.Name += `/`
|
|
|
+ } else {
|
|
|
+ // 设置:zip的文件压缩算法
|
|
|
+ header.Method = zip.Deflate
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建:压缩包头部信息
|
|
|
+ writer, _ := archive.CreateHeader(header)
|
|
|
+ if !info.IsDir() {
|
|
|
+ file, _ := os.Open(path)
|
|
|
+ defer file.Close()
|
|
|
+ io.Copy(writer, file)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+
|
|
|
+ // 删除缓存目录
|
|
|
+ os.RemoveAll(saveTmpDir)
|
|
|
+
|
|
|
+ return nil, nil
|
|
|
+}
|
|
|
+
|
|
|
// 创建生产计划
|
|
|
func CreateProductPlan(c *gin.Context, apictx *ApiSession) (interface{}, error) {
|
|
|
|