Browse Source

ADD:入库明细、出库明细

zoie 9 months ago
parent
commit
668b639936

+ 8 - 0
controllers/Basic.go

@@ -400,6 +400,14 @@ func (c *BasicController) Product_Edit() {
 		v.T_product_model = Product_r.T_model
 		StockDao.Update_Stock(v, "T_product_class", "T_product_name", "T_product_model")
 	}
+	// 修改月度统计信息
+	// 修改库存关联的产品信息
+	StockMonthDao := Stock.NewStockMonth(orm.NewOrm())
+	stockMonthList, err := StockMonthDao.Read_StockMonth_ByT_product_id(T_id)
+	for _, v := range stockMonthList {
+		v.T_product_class = Product_r.T_class
+		StockMonthDao.Update_StockMonth(v, "T_product_class")
+	}
 
 	NatsServer.AddUserLogs(c.User.T_uuid, "产品", "修改", Product_r)
 

+ 215 - 2
controllers/Stock.go

@@ -352,6 +352,41 @@ func (c *StockController) StockIn_List() {
 	c.ServeJSON()
 	return
 }
+func (c *StockController) StockIn_List_Product() {
+
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	// 查询
+	T_depot_id, _ := c.GetInt("T_depot_id")
+	T_name := c.GetString("T_name")
+	T_start_date := c.GetString("T_start_date")
+	T_end_date := c.GetString("T_end_date")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Basic.Read_Depot_All_Map()
+
+	StockInDao := Stock.NewStockIn(orm.NewOrm())
+	R_List, R_cnt := StockInDao.Read_StockInProduct_List(T_name, T_start_date, T_end_date, T_depot_id, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
 
 func (c *StockController) StockIn_Get() {
 
@@ -368,7 +403,7 @@ func (c *StockController) StockIn_Get() {
 		return
 	}
 
-	productList := StockInProductDao.Read_StockInProduct_List(stockIn.T_number)
+	productList := StockInProductDao.Read_StockInProduct_List_ByT_number(stockIn.T_number)
 
 	var pList []Stock.StockInProduct_R
 	for _, v := range productList {
@@ -528,6 +563,141 @@ func (c *StockController) StockIn_Add() {
 	return
 }
 
+func (c *StockController) StockIn_Edit() {
+
+	o := orm.NewOrm()
+	o.Begin()
+	StockInDao := Stock.NewStockIn(o)
+
+	T_number := c.GetString("T_number") // 入库单号
+	T_depot_id, _ := c.GetInt("T_depot_id")
+	T_date := c.GetString("T_date")
+	T_product := c.GetString("T_product")
+	T_remark := c.GetString("T_remark")
+	if _, is := lib.DateStrToTime(T_date); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "日期格式错误!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(c.User.T_uuid, "仓库管理", "入库", T_product)
+
+	var_ := Stock.StockIn{
+		T_number:   T_number,
+		T_depot_id: T_depot_id,
+		T_date:     T_date,
+		T_remark:   T_remark,
+		T_submit:   c.User.T_uuid,
+	}
+
+	StockInProductDao := Stock.NewStockInProduct(o)
+	StockDao := Stock.NewStock(o)
+	DeviceDao := Stock.NewDevice(o)
+	IotCardDao := Property.NewIotCard(&o)
+
+	_, err := StockInDao.Add_StockIn(var_)
+	if err != nil {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "入库失败"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_product) == 0 {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "产品明细不能为空"}
+		c.ServeJSON()
+		return
+	}
+
+	productList := lib.SplitString(T_product, "|")
+	for _, v := range productList {
+		product_id, _ := strconv.Atoi(strings.Split(v, "-")[0])
+
+		product, _ := Basic.Read_Product_ById(product_id)
+
+		num, _ := strconv.Atoi(strings.Split(v, "-")[1])
+		T_relation_sn := strings.Split(v, "-")[2]
+		if T_relation_sn == "" && product.T_relation_sn == 1 {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("%s关联SN,请先添加SN!", T_relation_sn)}
+			c.ServeJSON()
+			return
+		}
+		if len(T_relation_sn) > 0 {
+			snList := strings.Split(strings.Trim(T_relation_sn, ","), ",")
+			for _, sn := range snList {
+				mqtt := Stock.Read_MqttUser(sn)
+				// 添加设备
+				device := Stock.Device{
+					T_contract_number: "",
+					T_out_number:      "",
+					T_product_id:      product_id,
+					T_in_number:       T_number,
+					T_sn:              sn,
+					T_iccid:           mqtt.Iccid,
+					T_imei:            mqtt.Imei,
+					T_State:           2,
+				}
+				_, err = DeviceDao.AddOrUpdate_Device(device, 2)
+				if err != nil {
+					o.Rollback()
+					c.Data["json"] = lib.JSONS{Code: 202, Msg: sn + "入库失败"}
+					c.ServeJSON()
+					return
+				}
+
+				// 添加物联网卡
+				iotCard := Property.IotCard{
+					T_iccid: mqtt.Iccid,
+					T_sn:    sn,
+					T_State: 2, //1-未使用 2-已使用 3-已作废
+					T_type:  "4G",
+				}
+				_, err = IotCardDao.AddOrUpdate_IotCard(iotCard)
+				if err != nil {
+					o.Rollback()
+					c.Data["json"] = lib.JSONS{Code: 202, Msg: "入库失败"}
+					c.ServeJSON()
+					return
+				}
+
+			}
+		}
+		stockInProduct := Stock.StockInProduct{
+			T_number:      T_number,
+			T_product_id:  product_id,
+			T_depot_id:    T_depot_id,
+			T_num:         num,    // 入库数量
+			T_date:        T_date, // 入库日期
+			T_relation_sn: T_relation_sn,
+		}
+		_, err = StockInProductDao.Add_StockInProduct(stockInProduct)
+		if err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 203, Msg: "入库失败"}
+			c.ServeJSON()
+			return
+		}
+
+		_, err = StockDao.AddOrUpdate_Stock(T_depot_id, product.Id, product.T_class, product.T_name, product.T_model, num, 2)
+		if err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 203, Msg: "入库失败"}
+			c.ServeJSON()
+			return
+		}
+
+	}
+
+	o.Commit()
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "入库", "入库", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
+	c.ServeJSON()
+	return
+}
+
 func (c *StockController) StockOut_List() {
 
 	// 分页参数 初始化
@@ -564,6 +734,42 @@ func (c *StockController) StockOut_List() {
 	return
 }
 
+func (c *StockController) StockOut_List_Product() {
+
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	// 查询
+	T_depot_id, _ := c.GetInt("T_depot_id")
+	T_name := c.GetString("T_name")
+	T_start_date := c.GetString("T_start_date")
+	T_end_date := c.GetString("T_end_date")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Basic.Read_Depot_All_Map()
+
+	StockOutDao := Stock.NewStockOut(orm.NewOrm())
+	R_List, R_cnt := StockOutDao.Read_StockOutProduct_List(T_name, T_start_date, T_end_date, T_depot_id, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
 func (c *StockController) StockOut_Get() {
 
 	// 查询
@@ -618,6 +824,7 @@ func (c *StockController) StockOut_Add() {
 	T_receive := c.GetString("T_receive")
 	T_product := c.GetString("T_product")
 	T_remark := c.GetString("T_remark")
+	T_project := c.GetString("T_project")
 
 	T_delivery_type, _ := c.GetInt("T_delivery_type")
 	T_signer_unit := c.GetString("T_signer_unit")
@@ -640,6 +847,7 @@ func (c *StockController) StockOut_Add() {
 		T_date:            T_date,
 		T_receive:         T_receive,
 		T_remark:          T_remark,
+		T_project:         T_project,
 		T_submit:          c.User.T_uuid,
 		// 销售出库
 		T_delivery_type:  T_delivery_type, // 1-自送 2-自提 3-快递
@@ -707,6 +915,7 @@ func (c *StockController) StockOut_Add() {
 					T_iccid:           mqtt.Iccid,
 					T_imei:            mqtt.Imei,
 					T_State:           1,
+					T_project:         T_project,
 				}
 				_, err = DeviceDao.AddOrUpdate_Device(device, 1)
 				if err != nil {
@@ -814,6 +1023,7 @@ func (c *StockController) StockOut_Edit() {
 
 	T_number := c.GetString("T_number")
 	T_remark := c.GetString("T_remark")
+	T_project := c.GetString("T_project")
 	T_delivery_type, _ := c.GetInt("T_delivery_type")
 	T_signer_unit := c.GetString("T_signer_unit")
 	T_signer := c.GetString("T_signer")
@@ -833,6 +1043,9 @@ func (c *StockController) StockOut_Edit() {
 	if len(T_remark) > 0 {
 		stockOut.T_remark = T_remark
 	}
+	if len(T_project) > 0 {
+		stockOut.T_project = T_project
+	}
 	if T_delivery_type > 0 {
 		stockOut.T_delivery_type = T_delivery_type
 	}
@@ -852,7 +1065,7 @@ func (c *StockController) StockOut_Edit() {
 		stockOut.T_courier_number = T_courier_number
 	}
 
-	err = StockOutDao.Update_StockOut(stockOut, "T_remark", "T_delivery_type", "T_signer_unit", "T_signer", "T_signer_phone", "T_signer_date", "T_courier_number")
+	err = StockOutDao.Update_StockOut(stockOut, "T_remark", "T_delivery_type", "T_signer_unit", "T_signer", "T_signer_phone", "T_signer_date", "T_courier_number", "T_project")
 	if err != nil {
 		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "出库失败"}

+ 3 - 0
models/Basic/ProductClass.go

@@ -52,6 +52,7 @@ func Add_ProductClass(r ProductClass) (id int64, err error) {
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 	}
+	Read_ProductClass_All_Map()
 	return id, err
 }
 
@@ -74,6 +75,7 @@ func Update_ProductClass(m ProductClass, cols ...string) error {
 		logs.Error(lib.FuncName(), err)
 		return err
 	}
+	Read_ProductClass_All_Map()
 	return nil
 }
 
@@ -85,6 +87,7 @@ func Delete_ProductClass(v ProductClass) error {
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 	}
+	Read_ProductClass_All_Map()
 	return err
 }
 

+ 18 - 3
models/Stock/Device.go

@@ -22,6 +22,8 @@ type Device struct {
 	T_imei            string    `orm:"size(256);null"`                                        // 模组imei
 	T_State           int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-未出库/入库
 	T_remark          string    `orm:"type(text);null"`                                       // 备注
+	T_project         string    `orm:"type(text);null"`                                       // 出库项目
+	T_project_log     string    `orm:"type(text);null"`                                       // 出库项目
 	CreateTime        time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime        time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
@@ -52,6 +54,9 @@ type Device_R struct {
 	T_iccid           string // 物联网卡号
 	T_imei            string // 模组imei
 	T_State           int    // 1-已出库 2-未出库
+	T_remark          string
+	T_project         string
+	T_project_log     string
 
 	// ---------产品信息-----------
 	T_product_id         int
@@ -72,6 +77,9 @@ func DeviceToDevice_R(t Device) (r Device_R) {
 	r.T_iccid = t.T_iccid
 	r.T_imei = t.T_imei
 	r.T_State = t.T_State
+	r.T_remark = t.T_remark
+	r.T_project = t.T_project
+	r.T_project_log = t.T_project_log
 
 	r.T_product_id = t.T_product_id
 	product, _ := Basic.Read_Product_ById(t.T_product_id)
@@ -102,6 +110,9 @@ func (dao *DeviceDaoImpl) AddOrUpdate_Device(r Device, T_type int) (id int64, er
 	if err != nil {
 		if err.Error() == orm.ErrNoRows.Error() {
 			r.T_remark = fmt.Sprintf("%s:%s(%s)|", time.Now().Format("2006-01-02"), "入库", r.T_in_number)
+			if len(r.T_project) > 0 {
+				r.T_project_log += r.T_project + "|"
+			}
 			id, err = dao.orm.Insert(&r)
 			if err != nil {
 				logs.Error(lib.FuncName(), err)
@@ -130,8 +141,11 @@ func (dao *DeviceDaoImpl) AddOrUpdate_Device(r Device, T_type int) (id int64, er
 	}
 
 	r.T_remark = device.T_remark + T_remark
+	if len(r.T_project) > 0 {
+		r.T_project_log += r.T_project + "|"
+	}
 
-	_, err = dao.orm.Update(&r, "T_contract_number", "T_in_number", "T_out_number", "T_State", "T_remark")
+	_, err = dao.orm.Update(&r, "T_contract_number", "T_in_number", "T_out_number", "T_State", "T_remark", "T_project_log")
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return
@@ -194,7 +208,8 @@ func (dao *DeviceDaoImpl) Read_Device_List(T_name string, T_State, page, page_z
 			cond.Or("T_contract_number__icontains", T_name).
 				Or("T_out_number__icontains", T_name).
 				Or("T_sn__icontains", T_name).
-				Or("T_iccid__icontains", T_name))
+				Or("T_iccid__icontains", T_name).
+				Or("T_project__icontains", T_name))
 	}
 
 	if T_State > 0 {
@@ -207,7 +222,7 @@ func (dao *DeviceDaoImpl) Read_Device_List(T_name string, T_State, page, page_z
 		logs.Error(lib.FuncName(), err)
 		return
 	}
-	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 		return

+ 58 - 0
models/Stock/StockIn.go

@@ -3,8 +3,10 @@ package Stock
 import (
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
+	"fmt"
 	"git.baozhida.cn/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 
 	"ERP_storage/logs"
@@ -166,3 +168,59 @@ func (dao *StockInDaoImpl) Read_StockIn_List(T_depot_id int, T_start_date, T_end
 
 	return r_, cnt
 }
+
+// 通过入库编号查询入库产品列表
+func (dao *StockInDaoImpl) Read_StockInProduct_List(T_name, T_start_date, T_end_date string, T_depot_id int, page int, page_z int) (
+	r_ []StockInProductList, cnt int64) {
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	var maps_z []orm2.ParamsList
+	var r []StockInProductList
+	sqlWhere := ""
+	if len(T_name) > 0 {
+		sqlWhere += " AND (si.t_number like \"%" + T_name + "%\" or si.t_remark like \"%" + T_name + "%\")"
+	}
+	if T_depot_id > 0 {
+		sqlWhere += fmt.Sprintf(" AND si.t_depot_id = %d", T_depot_id)
+	}
+	if len(T_start_date) > 0 {
+		sqlWhere += " AND si.t_date >= \"" + T_start_date + "\""
+	}
+	if len(T_end_date) > 0 {
+		sqlWhere += " AND si.t_date <= \"" + T_end_date + "\""
+	}
+
+	// 获取总条数
+	sql := "SELECT COUNT(product.ID) FROM stock_in_product product LEFT JOIN stock_in si ON si.t_number=product.t_number WHERE 1=1 "
+	sql = sql + sqlWhere
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return r, 0
+	}
+	if len(maps_z) == 0 {
+		return r, 0
+	}
+	sql = "SELECT si.t_number as t_number,si.t_depot_id as t_depot_id,si.t_date as t_date,product.*,si.* FROM stock_in_product product " +
+		"LEFT JOIN stock_in si ON si.t_number=product.t_number WHERE 1=1"
+
+	sql = sql + sqlWhere
+
+	sql += " ORDER BY si.t_date DESC"
+
+	sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+
+	fmt.Println(sql)
+	_, err = dao.orm.Raw(sql).QueryRows(&r)
+	for _, v := range r {
+		r_ = append(r_, StockInProductListToStockInProductList(v))
+	}
+
+	count, _ := strconv.Atoi(maps_z[0][0].(string))
+	return r_, int64(count)
+}

+ 54 - 2
models/Stock/StockInProduct.go

@@ -1,6 +1,7 @@
 package Stock
 
 import (
+	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	"git.baozhida.cn/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
@@ -26,6 +27,31 @@ type StockInProduct struct {
 	UpdateTime    time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
+// 入库列表
+type StockInProductList struct {
+	Id            int
+	T_number      string // StockIn - 入库单号
+	T_depot_id    int    // StockIn - 仓库id
+	T_depot_name  string // StockIn - 仓库名称
+	T_date        string // StockIn - 业务日期
+	T_submit      string // StockIn - 经办人
+	T_submit_name string // StockIn - 经办人名称
+	T_remark      string // StockIn - 备注
+	T_num         int    // 入库数量
+	T_relation_sn string // 关联sn,20220101,20230202
+
+	T_device_list []string // sn关联列表
+
+	// ---------产品信息-----------
+	T_product_id          int
+	T_product_name        string
+	T_product_class_name  string
+	T_product_model       string
+	T_product_spec        string
+	T_product_relation_sn int
+	T_product_img         string
+}
+
 func (t *StockInProduct) TableName() string {
 	return "stock_in_product" // 数据库名称   // ************** 替换 FormulaList **************
 }
@@ -81,6 +107,32 @@ func StockInProductToStockInProduct_R(t StockInProduct) (r StockInProduct_R) {
 	r.T_product_img = product.T_img
 	return r
 }
+func StockInProductListToStockInProductList(t StockInProductList) (r StockInProductList) {
+	r.Id = t.Id
+	r.T_number = t.T_number
+	r.T_depot_id = t.T_depot_id
+	r.T_depot_name = Basic.Read_Depot_Get(t.T_depot_id)
+	r.T_num = t.T_num
+	r.T_date = t.T_date
+
+	r.T_submit = t.T_submit
+	r.T_submit_name = Account.Read_User_T_name_Get(t.T_submit)
+	r.T_remark = t.T_remark
+	r.T_num = t.T_num
+
+	r.T_relation_sn = t.T_relation_sn
+	r.T_device_list = lib.SplitString(t.T_relation_sn, ",")
+
+	r.T_product_id = t.T_product_id
+	product, _ := Basic.Read_Product_ById(t.T_product_id)
+	r.T_product_name = product.T_name
+	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
+	r.T_product_model = product.T_model
+	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
+	r.T_product_img = product.T_img
+	return r
+}
 
 // 添加
 func (dao *StockInProductDaoImpl) Add_StockInProduct(r StockInProduct) (id int64, err error) {
@@ -91,8 +143,8 @@ func (dao *StockInProductDaoImpl) Add_StockInProduct(r StockInProduct) (id int64
 	return id, err
 }
 
-// 获取 ById
-func (dao *StockInProductDaoImpl) Read_StockInProduct_List(T_number string) (r []StockInProduct) {
+// 通过入库编号查询入库产品列表
+func (dao *StockInProductDaoImpl) Read_StockInProduct_List_ByT_number(T_number string) (r []StockInProduct) {
 	qs := dao.orm.QueryTable(new(StockInProduct))
 	_, err := qs.Filter("T_number", T_number).All(&r)
 	if err != nil {

+ 20 - 0
models/Stock/StockMonth.go

@@ -146,3 +146,23 @@ func (dao *StockMonthDaoImpl) Read_StockMonth_List(T_depot_id, T_product_id, T_p
 
 	return r_
 }
+
+// 同步库存产品信息
+func (dao *StockMonthDaoImpl) Read_StockMonth_ByT_product_id(T_product_id int) (r []StockMonth, err error) {
+	qs := dao.orm.QueryTable(new(StockMonth))
+	_, err = qs.Filter("T_product_id", T_product_id).All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}
+
+// 修改
+func (dao *StockMonthDaoImpl) Update_StockMonth(m StockMonth, cols ...string) error {
+	_, err := dao.orm.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}

+ 58 - 0
models/Stock/StockOut.go

@@ -3,6 +3,7 @@ package Stock
 import (
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
+	"fmt"
 	"git.baozhida.cn/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	"strconv"
@@ -26,6 +27,7 @@ type StockOut struct {
 	T_receive         string `orm:"size(256);null"`  // 领取人
 	T_submit          string `orm:"size(256);null"`  // 经办人
 	T_remark          string `orm:"type(text);null"` // 备注
+	T_project         string `orm:"type(text);null"` // 出库项目
 	// ----销售出库------
 	T_delivery_type  int    `orm:"size(2);null"`   // 1-自送 2-自提 3-快递
 	T_signer_unit    string `orm:"size(256);null"` // 签收单位
@@ -222,3 +224,59 @@ func (dao *StockOutDaoImpl) Read_StockOut_T_contract_number(T_depot_id, T_produc
 	return strings.Join(r, ",")
 
 }
+
+// 通过入库编号查询入库产品列表
+func (dao *StockOutDaoImpl) Read_StockOutProduct_List(T_name, T_start_date, T_end_date string, T_depot_id int, page int, page_z int) (
+	r_ []StockOutProductList, cnt int64) {
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	var maps_z []orm2.ParamsList
+	var r []StockOutProductList
+	sqlWhere := ""
+	if len(T_name) > 0 {
+		sqlWhere += " AND (so.t_number like \"%" + T_name + "% or so.t_remark like \"%" + T_name + "%\" or so.t_project like \"%" + T_name + "%\")"
+	}
+	if T_depot_id > 0 {
+		sqlWhere += fmt.Sprintf(" AND so.t_depot_id = %d", T_depot_id)
+	}
+	if len(T_start_date) > 0 {
+		sqlWhere += " AND so.t_date >= \"" + T_start_date + "\""
+	}
+	if len(T_end_date) > 0 {
+		sqlWhere += " AND so.t_date <= \"" + T_end_date + "\""
+	}
+
+	// 获取总条数
+	sql := "SELECT COUNT(product.ID) FROM stock_out_product product LEFT JOIN stock_out so ON so.t_number=product.t_number WHERE 1=1 "
+	sql = sql + sqlWhere
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(sql).ValuesList(&maps_z)
+	if err != nil {
+		return r, 0
+	}
+	if len(maps_z) == 0 {
+		return r, 0
+	}
+	sql = "SELECT so.t_number as t_number,so.t_depot_id as t_depot_id,so.t_date as t_date,product.*,so.* FROM stock_out_product product " +
+		"LEFT JOIN stock_out so ON so.t_number=product.t_number WHERE 1=1"
+
+	sql = sql + sqlWhere
+
+	sql += " ORDER BY so.t_date DESC"
+
+	sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+
+	fmt.Println(sql)
+	_, err = dao.orm.Raw(sql).QueryRows(&r)
+	for _, v := range r {
+		r_ = append(r_, StockOutProductListToStockOutProductList(v))
+	}
+
+	count, _ := strconv.Atoi(maps_z[0][0].(string))
+	return r_, int64(count)
+}

+ 57 - 0
models/Stock/StockOutProduct.go

@@ -1,6 +1,7 @@
 package Stock
 
 import (
+	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	"git.baozhida.cn/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
@@ -81,6 +82,62 @@ func StockOutProductToStockOutProduct_R(t StockOutProduct) (r StockOutProduct_R)
 	return r
 }
 
+type StockOutProductList struct {
+	Id           int
+	T_number     string // StockOut - 出库单号
+	T_depot_id   int    // StockOut - 仓库id
+	T_depot_name string // StockOut - 仓库名称
+
+	T_date         string // StockOut - 业务日期
+	T_submit       string // StockOut - 经办人
+	T_remark       string // StockOut - 备注
+	T_project      string // StockOut - 项目
+	T_receive      string // StockOut - 领取人
+	T_receive_name string // 领取人名称
+	T_num          int    // 入库数量
+	T_relation_sn  string // 关联sn,20220101,20230202
+
+	T_device_list []string // sn关联列表
+
+	// ---------产品信息-----------
+	T_product_id          int
+	T_product_name        string
+	T_product_class_name  string
+	T_product_model       string
+	T_product_spec        string
+	T_product_relation_sn int
+	T_product_img         string
+}
+
+func StockOutProductListToStockOutProductList(t StockOutProductList) (r StockOutProductList) {
+	r.Id = t.Id
+	r.T_number = t.T_number
+	r.T_depot_id = t.T_depot_id
+	r.T_depot_name = Basic.Read_Depot_Get(t.T_depot_id)
+	r.T_num = t.T_num
+	r.T_date = t.T_date
+	r.T_receive = t.T_receive
+	r.T_receive_name = Account.Read_User_T_name_Get(t.T_receive)
+
+	r.T_submit = t.T_submit
+	r.T_remark = t.T_remark
+	r.T_project = t.T_project
+	r.T_num = t.T_num
+
+	r.T_relation_sn = t.T_relation_sn
+	r.T_device_list = lib.SplitString(t.T_relation_sn, ",")
+
+	r.T_product_id = t.T_product_id
+	product, _ := Basic.Read_Product_ById(t.T_product_id)
+	r.T_product_name = product.T_name
+	r.T_product_class_name = Basic.Read_ProductClass_Get(product.T_class)
+	r.T_product_model = product.T_model
+	r.T_product_spec = product.T_spec
+	r.T_product_relation_sn = product.T_relation_sn
+	r.T_product_img = product.T_img
+	return r
+}
+
 // 添加
 func (dao *StockOutProductDaoImpl) Add_StockOutProduct(r StockOutProduct) (id int64, err error) {
 	id, err = dao.orm.Insert(&r)

+ 9 - 7
routers/Stock.go

@@ -17,15 +17,17 @@ func init() {
 		beego.NSRouter("/Detail_Excel", &controllers.StockController{}, "*:Stock_Detail_Excel"), // 导出库存明细列表
 	)
 	stockIn := beego.NewNamespace("/StockIn",
-		beego.NSRouter("/List", &controllers.StockController{}, "*:StockIn_List"), // 入库列表
-		beego.NSRouter("/Get", &controllers.StockController{}, "*:StockIn_Get"),   // 入库详情
-		beego.NSRouter("/Add", &controllers.StockController{}, "*:StockIn_Add"),   // 入库
+		beego.NSRouter("/List", &controllers.StockController{}, "*:StockIn_List"),                 // 入库列表
+		beego.NSRouter("/List_Product", &controllers.StockController{}, "*:StockIn_List_Product"), // 入库列表 - 带产品明细
+		beego.NSRouter("/Get", &controllers.StockController{}, "*:StockIn_Get"),                   // 入库详情
+		beego.NSRouter("/Add", &controllers.StockController{}, "*:StockIn_Add"),                   // 入库
 	)
 	stockOut := beego.NewNamespace("/StockOut",
-		beego.NSRouter("/List", &controllers.StockController{}, "*:StockOut_List"), // 出库列表
-		beego.NSRouter("/Get", &controllers.StockController{}, "*:StockOut_Get"),   // 出库详情
-		beego.NSRouter("/Add", &controllers.StockController{}, "*:StockOut_Add"),   // 出库
-		beego.NSRouter("/Edit", &controllers.StockController{}, "*:StockOut_Edit"), // 修改发货单
+		beego.NSRouter("/List", &controllers.StockController{}, "*:StockOut_List"),                 // 出库列表
+		beego.NSRouter("/List_Product", &controllers.StockController{}, "*:StockOut_List_Product"), // 出库列表 - 带产品明细
+		beego.NSRouter("/Get", &controllers.StockController{}, "*:StockOut_Get"),                   // 出库详情
+		beego.NSRouter("/Add", &controllers.StockController{}, "*:StockOut_Add"),                   // 出库
+		beego.NSRouter("/Edit", &controllers.StockController{}, "*:StockOut_Edit"),                 // 修改发货单
 	)
 	beego.AddNamespace(device, stock, stockIn, stockOut)
 }