|
@@ -14,6 +14,7 @@ import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"math"
|
|
"math"
|
|
|
"os"
|
|
"os"
|
|
|
|
|
+ "sort"
|
|
|
"strconv"
|
|
"strconv"
|
|
|
"strings"
|
|
"strings"
|
|
|
"time"
|
|
"time"
|
|
@@ -218,12 +219,12 @@ func (c *StockController) Device_Check() {
|
|
|
T_date := c.GetString("T_date")
|
|
T_date := c.GetString("T_date")
|
|
|
|
|
|
|
|
// 检查MQTT授权
|
|
// 检查MQTT授权
|
|
|
- mqtt := Stock.Read_MqttUser(T_sn)
|
|
|
|
|
- if len(mqtt.Username) == 0 {
|
|
|
|
|
- c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】未授权,请先授权!", T_sn)}
|
|
|
|
|
- c.ServeJSON()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ //mqtt := Stock.Read_MqttUser(T_sn)
|
|
|
|
|
+ //if len(mqtt.Username) == 0 {
|
|
|
|
|
+ // c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】未授权,请先授权!", T_sn)}
|
|
|
|
|
+ // c.ServeJSON()
|
|
|
|
|
+ // return
|
|
|
|
|
+ //}
|
|
|
|
|
|
|
|
DeviceDao := Stock.NewDevice(orm.NewOrm())
|
|
DeviceDao := Stock.NewDevice(orm.NewOrm())
|
|
|
|
|
|
|
@@ -233,7 +234,8 @@ func (c *StockController) Device_Check() {
|
|
|
c.ServeJSON()
|
|
c.ServeJSON()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- checkTime := date.Format("2006-01-02 15:04:05")
|
|
|
|
|
|
|
+
|
|
|
|
|
+ checkTime := date.Format("2006-01-02") + time.Now().Format(" 15:04:05")
|
|
|
// T_State 1-已出库 2-未出库/入库
|
|
// T_State 1-已出库 2-未出库/入库
|
|
|
// 查询checkTime时间前最后一条记录
|
|
// 查询checkTime时间前最后一条记录
|
|
|
lastBeforeCheckTime, errBefore := DeviceDao.Read_Device_LastBeforeCheckTime(T_sn, checkTime)
|
|
lastBeforeCheckTime, errBefore := DeviceDao.Read_Device_LastBeforeCheckTime(T_sn, checkTime)
|
|
@@ -278,7 +280,7 @@ func (c *StockController) Device_Check() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 2. 时间前已入库,时间后有出库记录
|
|
// 2. 时间前已入库,时间后有出库记录
|
|
|
- if errBefore == nil && lastBeforeCheckTime.T_State == 2 && len(lastBeforeCheckTime.T_in_number) > 0 &&
|
|
|
|
|
|
|
+ if lastBeforeCheckTime.T_State == 2 && len(lastBeforeCheckTime.T_in_number) > 0 &&
|
|
|
errAfter == nil && firstAfterCheckTime.T_State == 1 && len(firstAfterCheckTime.T_out_number) > 0 {
|
|
errAfter == nil && firstAfterCheckTime.T_State == 1 && len(firstAfterCheckTime.T_out_number) > 0 {
|
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】已出库,请勿重复提交!", T_sn)}
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】已出库,请勿重复提交!", T_sn)}
|
|
|
c.ServeJSON()
|
|
c.ServeJSON()
|
|
@@ -286,7 +288,7 @@ func (c *StockController) Device_Check() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 3. 时间前已出库
|
|
// 3. 时间前已出库
|
|
|
- if errBefore == nil && lastBeforeCheckTime.T_State == 1 && len(lastBeforeCheckTime.T_out_number) > 0 {
|
|
|
|
|
|
|
+ if lastBeforeCheckTime.T_State == 1 && len(lastBeforeCheckTime.T_out_number) > 0 {
|
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】已出库,请勿重复提交!", T_sn)}
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("【%s】已出库,请勿重复提交!", T_sn)}
|
|
|
c.ServeJSON()
|
|
c.ServeJSON()
|
|
|
return
|
|
return
|
|
@@ -1043,6 +1045,7 @@ func (c *StockController) StockIn_Add() {
|
|
|
T_project := c.GetString("T_project")
|
|
T_project := c.GetString("T_project")
|
|
|
T_return_user := c.GetString("T_return_user")
|
|
T_return_user := c.GetString("T_return_user")
|
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name")
|
|
|
date, is := lib.DateStrToTime(T_date)
|
|
date, is := lib.DateStrToTime(T_date)
|
|
|
if !is {
|
|
if !is {
|
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
|
|
@@ -1070,6 +1073,7 @@ func (c *StockController) StockIn_Add() {
|
|
|
T_batch_number: T_batch_number,
|
|
T_batch_number: T_batch_number,
|
|
|
T_state: Stock.StockInWarehouse,
|
|
T_state: Stock.StockInWarehouse,
|
|
|
T_warehouse: c.User.T_uuid,
|
|
T_warehouse: c.User.T_uuid,
|
|
|
|
|
+ T_company_name: T_company_name,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
StockInProductDao := Stock.NewStockInProduct(o)
|
|
StockInProductDao := Stock.NewStockInProduct(o)
|
|
@@ -1262,6 +1266,7 @@ func (c *StockController) StockIn_Edit() {
|
|
|
T_project := c.GetString("T_project")
|
|
T_project := c.GetString("T_project")
|
|
|
T_return_user := c.GetString("T_return_user")
|
|
T_return_user := c.GetString("T_return_user")
|
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name")
|
|
|
date, is := lib.DateStrToTime(T_date)
|
|
date, is := lib.DateStrToTime(T_date)
|
|
|
if !is {
|
|
if !is {
|
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
|
|
c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
|
|
@@ -1554,9 +1559,9 @@ func (c *StockController) StockIn_Edit() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if len(T_remark) > 0 {
|
|
|
|
|
- stockIn.T_remark = T_remark
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ stockIn.T_remark = T_remark
|
|
|
|
|
+
|
|
|
if len(T_date) > 0 {
|
|
if len(T_date) > 0 {
|
|
|
stockIn.T_date = T_date
|
|
stockIn.T_date = T_date
|
|
|
}
|
|
}
|
|
@@ -1569,8 +1574,11 @@ func (c *StockController) StockIn_Edit() {
|
|
|
if len(T_batch_number) > 0 {
|
|
if len(T_batch_number) > 0 {
|
|
|
stockIn.T_batch_number = T_batch_number
|
|
stockIn.T_batch_number = T_batch_number
|
|
|
}
|
|
}
|
|
|
|
|
+ if len(T_company_name) > 0 {
|
|
|
|
|
+ stockIn.T_company_name = T_company_name
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- err = StockInDao.Update_StockIn(stockIn, "T_remark", "T_date", "T_project", "T_return_user", "T_batch_number")
|
|
|
|
|
|
|
+ err = StockInDao.Update_StockIn(stockIn, "T_remark", "T_date", "T_project", "T_return_user", "T_batch_number", "T_company_name")
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
o.Rollback()
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改入库失败"}
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改入库失败"}
|
|
@@ -2151,6 +2159,7 @@ func (c *StockController) StockIn_Apply() {
|
|
|
T_product := c.GetString("T_product")
|
|
T_product := c.GetString("T_product")
|
|
|
T_remark := c.GetString("T_remark")
|
|
T_remark := c.GetString("T_remark")
|
|
|
T_project := c.GetString("T_project")
|
|
T_project := c.GetString("T_project")
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name")
|
|
|
T_return_user := c.GetString("T_return_user")
|
|
T_return_user := c.GetString("T_return_user")
|
|
|
if len(T_return_user) == 0 {
|
|
if len(T_return_user) == 0 {
|
|
|
T_return_user = c.User.T_uuid
|
|
T_return_user = c.User.T_uuid
|
|
@@ -2172,6 +2181,7 @@ func (c *StockController) StockIn_Apply() {
|
|
|
T_submit: c.User.T_uuid,
|
|
T_submit: c.User.T_uuid,
|
|
|
T_project: T_project,
|
|
T_project: T_project,
|
|
|
T_return_user: T_return_user,
|
|
T_return_user: T_return_user,
|
|
|
|
|
+ T_company_name: T_company_name,
|
|
|
T_state: 1,
|
|
T_state: 1,
|
|
|
T_application_date: time.Now().Format("2006-01-02"),
|
|
T_application_date: time.Now().Format("2006-01-02"),
|
|
|
}
|
|
}
|
|
@@ -2232,6 +2242,7 @@ func (c *StockController) StockIn_Apply_Edit() {
|
|
|
T_remark := c.GetString("T_remark")
|
|
T_remark := c.GetString("T_remark")
|
|
|
T_project := c.GetString("T_project")
|
|
T_project := c.GetString("T_project")
|
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
T_batch_number := c.GetString("T_batch_number")
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name")
|
|
|
|
|
|
|
|
NatsServer.AddUserLogs(c.User.T_uuid, "仓库管理", "修改入库", T_product)
|
|
NatsServer.AddUserLogs(c.User.T_uuid, "仓库管理", "修改入库", T_product)
|
|
|
o := orm.NewOrm()
|
|
o := orm.NewOrm()
|
|
@@ -2351,17 +2362,20 @@ func (c *StockController) StockIn_Apply_Edit() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if len(T_remark) > 0 {
|
|
|
|
|
- stockIn.T_remark = T_remark
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ stockIn.T_remark = T_remark
|
|
|
|
|
+
|
|
|
if len(T_project) > 0 {
|
|
if len(T_project) > 0 {
|
|
|
stockIn.T_project = T_project
|
|
stockIn.T_project = T_project
|
|
|
}
|
|
}
|
|
|
if len(T_batch_number) > 0 {
|
|
if len(T_batch_number) > 0 {
|
|
|
stockIn.T_batch_number = T_batch_number
|
|
stockIn.T_batch_number = T_batch_number
|
|
|
}
|
|
}
|
|
|
|
|
+ if len(T_company_name) > 0 {
|
|
|
|
|
+ stockIn.T_company_name = T_company_name
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- err = StockInDao.Update_StockIn(stockIn, "T_remark", "T_project", "T_batch_number")
|
|
|
|
|
|
|
+ err = StockInDao.Update_StockIn(stockIn, "T_remark", "T_project", "T_batch_number", "T_company_name")
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
o.Rollback()
|
|
o.Rollback()
|
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改入库失败"}
|
|
c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改入库失败"}
|
|
@@ -2519,11 +2533,11 @@ func (c *StockController) StockIn_Warehouse() {
|
|
|
|
|
|
|
|
device := Stock.Device{
|
|
device := Stock.Device{
|
|
|
T_product_id: product_id,
|
|
T_product_id: product_id,
|
|
|
- T_out_number: T_number,
|
|
|
|
|
|
|
+ T_in_number: T_number,
|
|
|
T_sn: sn,
|
|
T_sn: sn,
|
|
|
T_iccid: mqtt.Iccid,
|
|
T_iccid: mqtt.Iccid,
|
|
|
T_imei: mqtt.Imei,
|
|
T_imei: mqtt.Imei,
|
|
|
- T_State: 1,
|
|
|
|
|
|
|
+ T_State: 2,
|
|
|
T_project: stockIn.T_project,
|
|
T_project: stockIn.T_project,
|
|
|
T_batch_number: batchNumber,
|
|
T_batch_number: batchNumber,
|
|
|
CreateTime: date,
|
|
CreateTime: date,
|
|
@@ -3459,9 +3473,9 @@ func (c *StockController) StockOut_Edit() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if len(T_remark) > 0 {
|
|
|
|
|
- StockOut.T_remark = T_remark
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ StockOut.T_remark = T_remark
|
|
|
|
|
+
|
|
|
if len(T_receive) > 0 {
|
|
if len(T_receive) > 0 {
|
|
|
StockOut.T_receive = T_receive
|
|
StockOut.T_receive = T_receive
|
|
|
}
|
|
}
|
|
@@ -4427,9 +4441,9 @@ func (c *StockController) StockOut_Apply_Edit() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
- if len(T_remark) > 0 {
|
|
|
|
|
- StockOut.T_remark = T_remark
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ StockOut.T_remark = T_remark
|
|
|
|
|
+
|
|
|
if len(T_project) > 0 {
|
|
if len(T_project) > 0 {
|
|
|
StockOut.T_project = T_project
|
|
StockOut.T_project = T_project
|
|
|
}
|
|
}
|
|
@@ -4925,3 +4939,514 @@ func UpdateAllStockMonthReturn(T_depot_id int, T_start_date, T_end_date string)
|
|
|
logs.Info(fmt.Sprintf("批量更新退库数据完成,共更新%d条记录", count))
|
|
logs.Info(fmt.Sprintf("批量更新退库数据完成,共更新%d条记录", count))
|
|
|
return count, nil
|
|
return count, nil
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// Company_Device_Statistics 查询公司借出和退回设备统计
|
|
|
|
|
+func (c *StockController) Company_Device_Statistics() {
|
|
|
|
|
+ // 查询参数(对前端返回扁平化分组列表,不再返回分页包装)
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name") // 公司名称
|
|
|
|
|
+ T_depot_id, _ := c.GetInt("T_depot_id") // 仓库ID
|
|
|
|
|
+ T_start_date := c.GetString("T_start_date") // 开始日期
|
|
|
|
|
+ T_end_date := c.GetString("T_end_date") // 结束日期
|
|
|
|
|
+
|
|
|
|
|
+ StockOutDao := Stock.NewStockOut(orm.NewOrm())
|
|
|
|
|
+ R_List, _ := StockOutDao.Read_Company_Device_Statistics(T_company_name, T_start_date, T_end_date, T_depot_id, 1, 9999)
|
|
|
|
|
+
|
|
|
|
|
+ // 1) 先按公司分组并排序,顺序与导出一致
|
|
|
|
|
+ companyMap := make(map[string][]Stock.CompanyDeviceStatistics)
|
|
|
|
|
+ for _, stat := range R_List {
|
|
|
|
|
+ if len(stat.T_stock_out_list) == 0 {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ companyMap[stat.T_company_name] = append(companyMap[stat.T_company_name], stat)
|
|
|
|
|
+ }
|
|
|
|
|
+ companyNames := make([]string, 0, len(companyMap))
|
|
|
|
|
+ for name := range companyMap {
|
|
|
|
|
+ companyNames = append(companyNames, name)
|
|
|
|
|
+ }
|
|
|
|
|
+ sort.Strings(companyNames)
|
|
|
|
|
+
|
|
|
|
|
+ // 2) 构造前端友好的结构:按公司返回 rows 列表 + 汇总
|
|
|
|
|
+ type RowItem struct {
|
|
|
|
|
+ Seq int `json:"seq"`
|
|
|
|
|
+ OutNumber string `json:"out_number"`
|
|
|
|
|
+ ProductName string `json:"product_name"`
|
|
|
|
|
+ DeviceSN string `json:"device_sn"`
|
|
|
|
|
+ Num int `json:"num"`
|
|
|
|
|
+ Unit string `json:"unit"`
|
|
|
|
|
+ Remark string `json:"remark"`
|
|
|
|
|
+ ReturnNumber string `json:"return_number"`
|
|
|
|
|
+ ReturnDeviceSN string `json:"return_device_sn"`
|
|
|
|
|
+ ReturnRemark string `json:"return_remark"`
|
|
|
|
|
+ }
|
|
|
|
|
+ type CompanyBlock struct {
|
|
|
|
|
+ CompanyName string `json:"company_name"`
|
|
|
|
|
+ StatisticDateLabel string `json:"statistic_date_label"`
|
|
|
|
|
+ OutTotal int `json:"out_total"`
|
|
|
|
|
+ ReturnTotal int `json:"return_total"`
|
|
|
|
|
+ Rows []RowItem `json:"rows"`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ resp := make([]CompanyBlock, 0, len(companyNames))
|
|
|
|
|
+ for _, companyName := range companyNames {
|
|
|
|
|
+ statList := companyMap[companyName]
|
|
|
|
|
+
|
|
|
|
|
+ // 构建退库 SN -> 信息 的映射
|
|
|
|
|
+ type ReturnInfo struct {
|
|
|
|
|
+ ReturnNumber string
|
|
|
|
|
+ SN string
|
|
|
|
|
+ Num int
|
|
|
|
|
+ Unit string
|
|
|
|
|
+ Total float64
|
|
|
|
|
+ Remark string
|
|
|
|
|
+ }
|
|
|
|
|
+ returnSNMap := make(map[string]ReturnInfo)
|
|
|
|
|
+ for _, stat := range statList {
|
|
|
|
|
+ for _, ret := range stat.T_stock_return_list {
|
|
|
|
|
+ for _, sn := range ret.T_device_list {
|
|
|
|
|
+ if len(sn) > 0 {
|
|
|
|
|
+ returnSNMap[sn] = ReturnInfo{
|
|
|
|
|
+ ReturnNumber: ret.T_stock_return_number,
|
|
|
|
|
+ SN: sn,
|
|
|
|
|
+ Num: ret.T_num,
|
|
|
|
|
+ Unit: ret.T_unit,
|
|
|
|
|
+ Total: ret.T_total,
|
|
|
|
|
+ Remark: ret.T_remark,
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ seqNo := 1
|
|
|
|
|
+ cumulativeOutTotal := 0
|
|
|
|
|
+ cumulativeReturnTotal := 0
|
|
|
|
|
+ rows := make([]RowItem, 0)
|
|
|
|
|
+
|
|
|
|
|
+ for _, stat := range statList {
|
|
|
|
|
+ for _, out := range stat.T_stock_out_list {
|
|
|
|
|
+ validSNs := make([]string, 0)
|
|
|
|
|
+ for _, sn := range out.T_device_list {
|
|
|
|
|
+ if len(sn) > 0 {
|
|
|
|
|
+ validSNs = append(validSNs, sn)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if len(validSNs) == 0 {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ cumulativeOutTotal += out.T_num
|
|
|
|
|
+
|
|
|
|
|
+ currentReturnNum := 0
|
|
|
|
|
+ returnRemark := ""
|
|
|
|
|
+ for _, sn := range validSNs {
|
|
|
|
|
+ if retInfo, exists := returnSNMap[sn]; exists {
|
|
|
|
|
+ currentReturnNum++
|
|
|
|
|
+ if len(returnRemark) == 0 {
|
|
|
|
|
+ returnRemark = retInfo.Remark
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ cumulativeReturnTotal += currentReturnNum
|
|
|
|
|
+
|
|
|
|
|
+ for idx, sn := range validSNs {
|
|
|
|
|
+ row := RowItem{
|
|
|
|
|
+ DeviceSN: sn,
|
|
|
|
|
+ }
|
|
|
|
|
+ if retInfo, ok := returnSNMap[sn]; ok {
|
|
|
|
|
+ row.ReturnDeviceSN = sn
|
|
|
|
|
+ row.ReturnNumber = retInfo.ReturnNumber
|
|
|
|
|
+ }
|
|
|
|
|
+ if idx == 0 {
|
|
|
|
|
+ row.Seq = seqNo
|
|
|
|
|
+ row.ProductName = out.T_product_name
|
|
|
|
|
+ row.OutNumber = stat.T_stock_out_number
|
|
|
|
|
+ row.Num = out.T_num
|
|
|
|
|
+ row.Unit = out.T_unit
|
|
|
|
|
+ row.Remark = out.T_remark
|
|
|
|
|
+ if len(returnRemark) > 0 {
|
|
|
|
|
+ row.ReturnRemark = returnRemark
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ rows = append(rows, row)
|
|
|
|
|
+ }
|
|
|
|
|
+ seqNo++
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ resp = append(resp, CompanyBlock{
|
|
|
|
|
+ OutTotal: cumulativeOutTotal,
|
|
|
|
|
+ ReturnTotal: cumulativeReturnTotal,
|
|
|
|
|
+ Rows: rows,
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: resp}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Company_Device_Statistics_Excel 导出公司借出和退回设备统计Excel
|
|
|
|
|
+func (c *StockController) Company_Device_Statistics_Excel() {
|
|
|
|
|
+ // 查询参数
|
|
|
|
|
+ T_company_name := c.GetString("T_company_name") // 公司名称
|
|
|
|
|
+ T_depot_id, _ := c.GetInt("T_depot_id") // 仓库ID
|
|
|
|
|
+ T_start_date := c.GetString("T_start_date") // 开始日期
|
|
|
|
|
+ T_end_date := c.GetString("T_end_date") // 结束日期
|
|
|
|
|
+
|
|
|
|
|
+ StockOutDao := Stock.NewStockOut(orm.NewOrm())
|
|
|
|
|
+ R_List, _ := StockOutDao.Read_Company_Device_Statistics(T_company_name, T_start_date, T_end_date, T_depot_id, 1, 9999)
|
|
|
|
|
+
|
|
|
|
|
+ // 生成Excel文件名
|
|
|
|
|
+ filename := fmt.Sprintf("公司设备借出退回统计(%s)", lib.GetRandstring(6, "0123456789", 0))
|
|
|
|
|
+
|
|
|
|
|
+ // 创建Excel文件
|
|
|
|
|
+ f := excelize.NewFile()
|
|
|
|
|
+
|
|
|
|
|
+ // 设置样式
|
|
|
|
|
+ StyleTitle, _ := f.NewStyle(
|
|
|
|
|
+ &excelize.Style{
|
|
|
|
|
+ Font: &excelize.Font{Bold: true, Size: 14, Family: "宋体"},
|
|
|
|
|
+ Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ StyleHeader, _ := f.NewStyle(
|
|
|
|
|
+ &excelize.Style{
|
|
|
|
|
+ Font: &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
|
|
|
|
|
+ Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
|
|
|
|
|
+ Border: []excelize.Border{
|
|
|
|
|
+ {Type: "left", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "top", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "bottom", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "right", Color: "000000", Style: 1},
|
|
|
|
|
+ },
|
|
|
|
|
+ Fill: excelize.Fill{Type: "pattern", Color: []string{"#E0E0E0"}, Pattern: 1},
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ StyleCell, _ := f.NewStyle(
|
|
|
|
|
+ &excelize.Style{
|
|
|
|
|
+ Font: &excelize.Font{Size: 10, Family: "宋体"},
|
|
|
|
|
+ Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
|
|
|
|
|
+ Border: []excelize.Border{
|
|
|
|
|
+ {Type: "left", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "top", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "bottom", Color: "000000", Style: 1},
|
|
|
|
|
+ {Type: "right", Color: "000000", Style: 1},
|
|
|
|
|
+ },
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ currentRow := 1
|
|
|
|
|
+ sheetName := "Sheet1"
|
|
|
|
|
+
|
|
|
|
|
+ // 按公司名称分组数据
|
|
|
|
|
+ companyMap := make(map[string][]Stock.CompanyDeviceStatistics)
|
|
|
|
|
+ for _, stat := range R_List {
|
|
|
|
|
+ if len(stat.T_stock_out_list) == 0 {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ companyMap[stat.T_company_name] = append(companyMap[stat.T_company_name], stat)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 提取并排序公司名称,确保导出顺序稳定
|
|
|
|
|
+ companyNames := make([]string, 0, len(companyMap))
|
|
|
|
|
+ for name := range companyMap {
|
|
|
|
|
+ companyNames = append(companyNames, name)
|
|
|
|
|
+ }
|
|
|
|
|
+ sort.Strings(companyNames)
|
|
|
|
|
+
|
|
|
|
|
+ // 按排序后的公司名称遍历
|
|
|
|
|
+ for _, companyName := range companyNames {
|
|
|
|
|
+ statList := companyMap[companyName]
|
|
|
|
|
+ // 合并标题行
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("L%d", currentRow))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("A%d", currentRow), "出库申请单/退库单")
|
|
|
|
|
+ f.SetCellStyle(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("L%d", currentRow), StyleTitle)
|
|
|
|
|
+ f.SetRowHeight(sheetName, currentRow, 25)
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+
|
|
|
|
|
+ // 出库信息行
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("H%d", currentRow))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("A%d", currentRow), "公司名称:"+companyName)
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("I%d", currentRow), fmt.Sprintf("L%d", currentRow))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("I%d", currentRow), "")
|
|
|
|
|
+ f.SetCellStyle(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("L%d", currentRow), StyleCell)
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+
|
|
|
|
|
+ // 日期行
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("H%d", currentRow))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("A%d", currentRow), "统计日期:"+time.Now().Format("2006-01-02"))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("I%d", currentRow), fmt.Sprintf("L%d", currentRow))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("I%d", currentRow), "")
|
|
|
|
|
+ f.SetCellStyle(sheetName, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("L%d", currentRow), StyleCell)
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+
|
|
|
|
|
+ // 表头(增加出库单号和退库单号列)
|
|
|
|
|
+ headers := []string{"序号", "出库单号", "品名", "设备编号", "数量", "单位", "累计", "备注", "退库单号", "退库设备编号", "累计", "备注"}
|
|
|
|
|
+ for i, header := range headers {
|
|
|
|
|
+ cell := fmt.Sprintf("%s%d", string(rune('A'+i)), currentRow)
|
|
|
|
|
+ f.SetCellValue(sheetName, cell, header)
|
|
|
|
|
+ f.SetCellStyle(sheetName, cell, cell, StyleHeader)
|
|
|
|
|
+ }
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+
|
|
|
|
|
+ // 构建出库SN到退库信息的映射(包含退库单号)
|
|
|
|
|
+ type ReturnInfo struct {
|
|
|
|
|
+ ReturnNumber string // 退库单号
|
|
|
|
|
+ SN string
|
|
|
|
|
+ Num int
|
|
|
|
|
+ Unit string
|
|
|
|
|
+ Total float64
|
|
|
|
|
+ Remark string
|
|
|
|
|
+ }
|
|
|
|
|
+ returnSNMap := make(map[string]ReturnInfo) // 出库SN -> 退库信息
|
|
|
|
|
+
|
|
|
|
|
+ // 收集该公司所有的退库信息
|
|
|
|
|
+ for _, stat := range statList {
|
|
|
|
|
+ for _, ret := range stat.T_stock_return_list {
|
|
|
|
|
+ for _, sn := range ret.T_device_list {
|
|
|
|
|
+ if len(sn) > 0 {
|
|
|
|
|
+ returnSNMap[sn] = ReturnInfo{
|
|
|
|
|
+ ReturnNumber: ret.T_stock_return_number, // 关联的退库单号
|
|
|
|
|
+ SN: sn,
|
|
|
|
|
+ Num: ret.T_num,
|
|
|
|
|
+ Unit: ret.T_unit,
|
|
|
|
|
+ Total: ret.T_total,
|
|
|
|
|
+ Remark: ret.T_remark,
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历该公司所有出库单的出库明细,按SN展开
|
|
|
|
|
+ seqNo := 1
|
|
|
|
|
+ cumulativeOutTotal := 0 // 累计出库总数
|
|
|
|
|
+ cumulativeReturnTotal := 0 // 累计退库总数
|
|
|
|
|
+ cumulativeStartRow := currentRow
|
|
|
|
|
+
|
|
|
|
|
+ // 记录每个出库单号的起始行和结束行,用于后续合并
|
|
|
|
|
+ type OutNumberRange struct {
|
|
|
|
|
+ StartRow int
|
|
|
|
|
+ EndRow int
|
|
|
|
|
+ Number string
|
|
|
|
|
+ }
|
|
|
|
|
+ outNumberRanges := make([]OutNumberRange, 0)
|
|
|
|
|
+
|
|
|
|
|
+ // 记录每个退库单号的起始行和结束行
|
|
|
|
|
+ type ReturnNumberRange struct {
|
|
|
|
|
+ StartRow int
|
|
|
|
|
+ EndRow int
|
|
|
|
|
+ Number string
|
|
|
|
|
+ }
|
|
|
|
|
+ //returnNumberRanges := make([]ReturnNumberRange, 0)
|
|
|
|
|
+
|
|
|
|
|
+ for _, stat := range statList {
|
|
|
|
|
+ outNumberStartRow := currentRow // 记录当前出库单号的起始行
|
|
|
|
|
+ //hasReturnInThisOut := false // 标记当前出库单是否有退库
|
|
|
|
|
+ //returnNumberStartRow := currentRow
|
|
|
|
|
+
|
|
|
|
|
+ for _, out := range stat.T_stock_out_list {
|
|
|
|
|
+ // 过滤掉空的SN
|
|
|
|
|
+ validSNs := make([]string, 0)
|
|
|
|
|
+ for _, sn := range out.T_device_list {
|
|
|
|
|
+ if len(sn) > 0 {
|
|
|
|
|
+ validSNs = append(validSNs, sn)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if len(validSNs) == 0 {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 累加当前产品的出库数量
|
|
|
|
|
+ cumulativeOutTotal += out.T_num
|
|
|
|
|
+
|
|
|
|
|
+ // 计算当前产品的退库数量和获取退库备注
|
|
|
|
|
+ currentReturnNum := 0
|
|
|
|
|
+ returnRemark := ""
|
|
|
|
|
+ for _, sn := range validSNs {
|
|
|
|
|
+ if retInfo, exists := returnSNMap[sn]; exists {
|
|
|
|
|
+ currentReturnNum++
|
|
|
|
|
+ if len(returnRemark) == 0 {
|
|
|
|
|
+ returnRemark = retInfo.Remark // 使用第一个退库记录的备注
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ cumulativeReturnTotal += currentReturnNum
|
|
|
|
|
+
|
|
|
|
|
+ // 标记该出库单是否有退库
|
|
|
|
|
+ //if currentReturnNum > 0 {
|
|
|
|
|
+ // hasReturnInThisOut = true
|
|
|
|
|
+ //}
|
|
|
|
|
+
|
|
|
|
|
+ startRow := currentRow
|
|
|
|
|
+ // 为每个SN创建一行
|
|
|
|
|
+ for idx, sn := range validSNs {
|
|
|
|
|
+ // 出库单号(C列)和设备编号(D列)
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("D%d", currentRow), sn)
|
|
|
|
|
+
|
|
|
|
|
+ // 退库信息(如果该SN已退库,则显示)
|
|
|
|
|
+ if retInfo, exists := returnSNMap[sn]; exists {
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("J%d", currentRow), sn) // 退库设备编号
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("I%d", currentRow), retInfo.ReturnNumber)
|
|
|
|
|
+ // 退库单号只在第一行显示
|
|
|
|
|
+ // if idx == 0 && currentReturnNum > 0 {
|
|
|
|
|
+ // f.SetCellValue(sheetName, fmt.Sprintf("I%d", currentRow), retInfo.ReturnNumber)
|
|
|
|
|
+ // }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 只在第一行设置序号、品名、出库单号、数量、单位、累计、备注
|
|
|
|
|
+ if idx == 0 {
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("A%d", currentRow), seqNo)
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("C%d", currentRow), out.T_product_name)
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("B%d", currentRow), stat.T_stock_out_number) // 出库单号
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("E%d", currentRow), out.T_num)
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("F%d", currentRow), out.T_unit)
|
|
|
|
|
+ //f.SetCellValue(sheetName, fmt.Sprintf("G%d", currentRow), cumulativeOutTotal) // 显示累计出库总数
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("H%d", currentRow), out.T_remark)
|
|
|
|
|
+
|
|
|
|
|
+ // 退库数量、单位、累计合计、备注
|
|
|
|
|
+ if currentReturnNum > 0 {
|
|
|
|
|
+ //f.SetCellValue(sheetName, fmt.Sprintf("K%d", currentRow), currentReturnNum)
|
|
|
|
|
+ //f.SetCellValue(sheetName, fmt.Sprintf("L%d", currentRow), out.T_unit)
|
|
|
|
|
+ //f.SetCellValue(sheetName, fmt.Sprintf("M%d", currentRow), cumulativeReturnTotal) // 显示累计退库总数
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("L%d", currentRow), returnRemark) // 显示退库备注
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 设置单元格样式
|
|
|
|
|
+ for col := 'A'; col <= 'L'; col++ {
|
|
|
|
|
+ cell := fmt.Sprintf("%s%d", string(col), currentRow)
|
|
|
|
|
+ f.SetCellStyle(sheetName, cell, cell, StyleCell)
|
|
|
|
|
+ }
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有多个SN,合并序号、品名、数量、单位、累计、备注列(出库单号C列和退库单号I列在外层统一合并)
|
|
|
|
|
+ if len(validSNs) > 1 {
|
|
|
|
|
+ endRow := currentRow - 1
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("A%d", startRow), fmt.Sprintf("A%d", endRow))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("C%d", startRow), fmt.Sprintf("C%d", endRow))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("E%d", startRow), fmt.Sprintf("E%d", endRow))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("F%d", startRow), fmt.Sprintf("F%d", endRow))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("G%d", startRow), fmt.Sprintf("G%d", endRow))
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("H%d", startRow), fmt.Sprintf("H%d", endRow))
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ seqNo++
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 记录当前出库单号的范围
|
|
|
|
|
+ if currentRow > outNumberStartRow {
|
|
|
|
|
+ outNumberRanges = append(outNumberRanges, OutNumberRange{
|
|
|
|
|
+ StartRow: outNumberStartRow,
|
|
|
|
|
+ EndRow: currentRow - 1,
|
|
|
|
|
+ Number: stat.T_stock_out_number,
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 合并相同出库单号的单元格(C列)
|
|
|
|
|
+ for _, rng := range outNumberRanges {
|
|
|
|
|
+ if rng.EndRow > rng.StartRow {
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("B%d", rng.StartRow), fmt.Sprintf("B%d", rng.EndRow))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 合并相同退库单号的单元格(I列)
|
|
|
|
|
+ // for _, rng := range returnNumberRanges {
|
|
|
|
|
+ // if rng.EndRow > rng.StartRow {
|
|
|
|
|
+ // f.MergeCell(sheetName, fmt.Sprintf("I%d", rng.StartRow), fmt.Sprintf("I%d", rng.EndRow))
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+
|
|
|
|
|
+ // 合并出库累计
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("G%d", cumulativeStartRow), fmt.Sprintf("G%d", currentRow-1))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("G%d", cumulativeStartRow), cumulativeOutTotal) // 显示累计出库总数
|
|
|
|
|
+
|
|
|
|
|
+ // 合并退库累计
|
|
|
|
|
+ f.MergeCell(sheetName, fmt.Sprintf("K%d", cumulativeStartRow), fmt.Sprintf("K%d", currentRow-1))
|
|
|
|
|
+ f.SetCellValue(sheetName, fmt.Sprintf("K%d", cumulativeStartRow), cumulativeReturnTotal) // 显示累计退库总数
|
|
|
|
|
+
|
|
|
|
|
+ // 添加空行
|
|
|
|
|
+ currentRow++
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 设置列宽(14列)
|
|
|
|
|
+ f.SetColWidth(sheetName, "A", "A", 8) // 序号
|
|
|
|
|
+ f.SetColWidth(sheetName, "B", "B", 20) // 品名
|
|
|
|
|
+ f.SetColWidth(sheetName, "C", "C", 20) // 出库单号
|
|
|
|
|
+ f.SetColWidth(sheetName, "D", "D", 30) // 设备编号
|
|
|
|
|
+ f.SetColWidth(sheetName, "E", "F", 10) // 数量、单位
|
|
|
|
|
+ f.SetColWidth(sheetName, "G", "G", 12) // 累计
|
|
|
|
|
+ f.SetColWidth(sheetName, "H", "H", 20) // 备注
|
|
|
|
|
+ f.SetColWidth(sheetName, "I", "I", 20) // 退库单号
|
|
|
|
|
+ f.SetColWidth(sheetName, "J", "J", 30) // 退库设备编号
|
|
|
|
|
+ f.SetColWidth(sheetName, "K", "K", 12) // 累计
|
|
|
|
|
+ f.SetColWidth(sheetName, "L", "L", 20) // 备注
|
|
|
|
|
+
|
|
|
|
|
+ // 保存文件
|
|
|
|
|
+ filepath := "./ofile/" + filename + ".xlsx"
|
|
|
|
|
+ if err := f.SaveAs(filepath); err != nil {
|
|
|
|
|
+ logs.Error(lib.FuncName(), err)
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 201, Msg: "生成Excel失败"}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var url string
|
|
|
|
|
+ //// 上传 OSS
|
|
|
|
|
+ nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
|
|
|
|
|
+ url, is := nats.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+filename+".xlsx", "ofile/"+filename+".xlsx")
|
|
|
|
|
+ if !is {
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ //删除目录
|
|
|
|
|
+ err := os.Remove("ofile/" + filename + ".xlsx")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ logs.Error(lib.FuncName(), err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Company_Name_List 获取所有出库的公司名称列表
|
|
|
|
|
+func (c *StockController) Stock_Out_Company_Name_List() {
|
|
|
|
|
+ T_name := c.GetString("T_name") // 公司名称(模糊查询)
|
|
|
|
|
+
|
|
|
|
|
+ StockOutDao := Stock.NewStockOut(orm.NewOrm())
|
|
|
|
|
+ R_List, err := StockOutDao.Read_Company_Name_List(T_name)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 201, Msg: "查询失败"}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: R_List}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Company_Name_List 获取所有出库的公司名称列表
|
|
|
|
|
+func (c *StockController) Stock_Out_Project_List() {
|
|
|
|
|
+ T_name := c.GetString("T_name") // 公司名称(模糊查询)
|
|
|
|
|
+
|
|
|
|
|
+ StockOutDao := Stock.NewStockOut(orm.NewOrm())
|
|
|
|
|
+ R_List, err := StockOutDao.Read_Project_List(T_name)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 201, Msg: "查询失败"}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: R_List}
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+}
|