final_material_order.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. package final
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gogf/gf/v2/os/gtime"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. _ "image/gif"
  8. _ "image/jpeg"
  9. _ "image/png"
  10. "strings"
  11. "time"
  12. "zhiyuan/pkg/db"
  13. "zhiyuan/pkg/logger"
  14. "zhiyuan/pkg/utils"
  15. "zhiyuan/pkg/weixin/mp"
  16. "zhiyuan/services/admin"
  17. "github.com/gin-gonic/gin"
  18. )
  19. type FinalMaterialOrder struct {
  20. ID int64 `json:"id" prop:"add:false"`
  21. OrderNo string `json:"order_no" label:"订单号" type:"string" prop:"add:false" search:"like"`
  22. SiteId int64 `json:"site_id" label:"工地" type:"int" prop:"add:false" search:"="`
  23. Type int64 `json:"type" label:"类型" type:"int" prop:"add:false" search:"="`
  24. IsCustom int64 `json:"is_custom" label:"是否定制" type:"int" prop:"add:false" search:"="`
  25. TypeId int64 `json:"type_id" label:"类型ID" type:"int" prop:"add:false" search:"="`
  26. SupplierId int64 `json:"supplier_id" label:"材料商ID" type:"int" prop:"add:false" search:"="`
  27. Total float64 `json:"total" label:"金额" type:"float" prop:"add:false" default:"0"`
  28. ReceiptDate int64 `json:"receipt_date" label:"配送日期" type:"int" prop:"add:false" default:"0"`
  29. InstallDate int64 `json:"install_date" label:"安装日期" type:"int" prop:"add:false" default:"0"`
  30. State int64 `json:"state" label:"状态" type:"int" prop:"add:false" default:"0" search:"="`
  31. ProcessId int64 `json:"process_id" label:"待完成审核流程" type:"int" prop:"add:false" default:"0" search:"="`
  32. SettleId int64 `json:"settle_id" label:"结算流程" type:"int" prop:"add:false" default:"0" search:"="`
  33. TakeTime int64 `json:"take_time" label:"下单时间" type:"int" prop:"add:false" default:"0" search:"="`
  34. StockTime int64 `json:"stock_time" label:"备货时间" type:"int" prop:"add:false" default:"0" search:"="`
  35. NoticeTime int64 `json:"notice_time" label:"通知配送时间" type:"int" prop:"add:false" default:"0" search:"="`
  36. DeliverTime int64 `json:"deliver_time" label:"送达时间" type:"int" prop:"add:false" default:"0" search:"="`
  37. AcceptTime int64 `json:"accept_time" label:"收货时间" type:"int" prop:"add:false" default:"0" search:"="`
  38. InstallTime int64 `json:"install_time" label:"安装时间" type:"int" prop:"add:false" default:"0" search:"="`
  39. OverTime int64 `json:"over_time" label:"完成时间" type:"int" prop:"add:false" default:"0" search:"="`
  40. NoticeMeasureTime int64 `json:"notice_measure_time" label:"通知测量时间" type:"int" prop:"add:false" default:"0" search:"="`
  41. MeasureTime int64 `json:"measure_time" label:"测量时间" type:"int" prop:"add:false" default:"0" search:"="`
  42. ReportTimeout int64 `json:"report_timeout" label:"报备超时计数" type:"int" prop:"add:false" default:"0" search:"="`
  43. Attachment string `json:"attachment" label:"附件" type:"string" prop:"add:false"`
  44. CreatedId int64 `json:"created_id" type:"int" prop:"add:false"`
  45. DeletedAt int64 `json:"deleted_at" prop:"add:false select:false"`
  46. CreatedAt int64 `json:"created_at" prop:"add:false"`
  47. UpdatedAt int64 `json:"updated_at" prop:"add:false"`
  48. db.BaseModel
  49. }
  50. func (FinalMaterialOrder) TableName() string {
  51. return "zy_final_material_order"
  52. }
  53. func (model FinalMaterialOrder) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  54. return true
  55. }
  56. func (FinalMaterialOrder) OnePrivilege(c *gin.Context, id int64) bool {
  57. return true
  58. }
  59. func (FinalMaterialOrder) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error {
  60. return errors.New("没有权限")
  61. }
  62. func (FinalMaterialOrder) EditPrivilege(c *gin.Context, id int64, data map[string]interface{}, post map[string]interface{}) error {
  63. return errors.New("没有权限")
  64. }
  65. func (FinalMaterialOrder) DelPrivilege(c *gin.Context, id int64) error {
  66. return errors.New("没有权限")
  67. }
  68. func (FinalMaterialOrder) Page() bool {
  69. return false
  70. }
  71. func (FinalMaterialOrder) Count() bool {
  72. return true
  73. }
  74. type FinalMaterialOrderMobile struct {
  75. Supplier string `json:"supplier" label:"材料商" prop:"select:supplier.name" search:"like"`
  76. SupplierName string `json:"supplier_name" type:"string" prop:"select:supplier.name" search:"like"`
  77. SupplierAdminId int64 `json:"supplier_admin_id" type:"int" prop:"select:supplier.adminId"`
  78. Install int64 `json:"install" label:"安装" type:"int" prop:"select:supplier.install"`
  79. ReceiptHour int64 `json:"receipt_hour" type:"int" prop:"select:supplier.receipt_hour"`
  80. InstallHour int64 `json:"install_hour" type:"int" prop:"select:supplier.install_hour"`
  81. StockHour int64 `json:"stock_hour" label:"备货小时" type:"int" prop:"select:if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)"`
  82. Username string `json:"username" label:"业主姓名" prop:"select:finalsite.username" search:"like"`
  83. Phone string `json:"phone" label:"手机号码" prop:"select:finalsite.phone" search:"like"`
  84. Village string `json:"village" label:"小区名称" prop:"select:finalsite.village" search:"like"`
  85. Address string `json:"address" label:"房屋地址" prop:"select:finalsite.address" search:"like"`
  86. RoomNo string `json:"room_no" label:"楼栋房号" prop:"select:finalsite.room_no" search:"like"`
  87. Area float64 `json:"area" label:"面积" type:"float" prop:"select:finalsite.area"`
  88. ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="`
  89. ShopName int64 `json:"shop_name" label:"门店" prop:"select:shop.shop_name"`
  90. CollectInfo string `json:"collect_info" label:"门店" prop:"select:shop.collect_info"`
  91. PkgId int64 `json:"pkg_id" label:"套餐" type:"int" prop:"select:finalsite.pkg_id" search:"="`
  92. TypeId int64 `json:"type_id" label:"开工类型" type:"int" prop:"select:finalsite.type_id" search:"="`
  93. ManagerId int64 `json:"manager_id" label:"项目经理" type:"int" prop:"select:finalsite.manager_id" search:"="`
  94. ProjectLeaderId int64 `json:"project_leader_id" label:"工程队长" type:"int" prop:"select:finalsite.project_leader_id" search:"="`
  95. DesignerId int64 `json:"designer_id" label:"设计师" type:"int" prop:"select:finalsite.designer_id" search:"="`
  96. Names string `json:"names" label:"名称" type:"string" prop:"add:false select:concat(finalsite.village,finalsite.address,finalsite.room_no)" search:"like"`
  97. StartTime int64 `json:"starttime" label:"开工日期" type:"int" prop:"select:finalsite.starttime"`
  98. ProcessType int64 `json:"process_type" type:"int" prop:"select:process.type" search:"="`
  99. ManagerName string `json:"manager_name" type:"string" prop:"select:manager.username"`
  100. ManagerPhone string `json:"manager_phone" type:"string" prop:"select:manager.phone"`
  101. ManagerHeadImgUrl string `json:"manager_headimgurl" type:"string" prop:"select:manager.headimgurl"`
  102. DesignerName string `json:"designer_name" type:"string" prop:"select:designer.username"`
  103. DesignerPhone string `json:"designer_phone" type:"string" prop:"select:designer.phone"`
  104. DesignerHeadImgUrl string `json:"designer_headimgurl" type:"string" prop:"select:designer.headimgurl"`
  105. ProjectLeaderName string `json:"project_leader_name" type:"string" prop:"select:project_leader.username"`
  106. ProjectLeaderPhone string `json:"project_leader_phone" type:"string" prop:"select:project_leader.phone"`
  107. ProjectLeaderHeadImgUrl string `json:"project_leader_headimgurl" type:"string" prop:"select:project_leader.headimgurl"`
  108. SettleState int64 `json:"settle_state" label:"结算状态" type:"int" prop:"select:settle.state" search:"="`
  109. SettleCreatedAt int64 `json:"settle_created_at" type:"int" prop:"select:settle.created_at"`
  110. PkgName int64 `json:"pkg_name" label:"套餐" prop:"select:finalpkg.name"`
  111. MeasureTimeout int64 `json:"measure_timeout" label:"量尺超时" prop:"select:if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0)" search:"="`
  112. StockTimeout int64 `json:"stock_timeout" label:"备货超时" prop:"select:if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600<zy_final_material_order.stock_time,1,0)" search:"="`
  113. ReceiptTimeout int64 `json:"receipt_timeout" label:"配送超时" prop:"select:if(zy_final_material_order.deliver_time>zy_final_material_order.receipt_date,1,0)" search:"="`
  114. InstallTimeout int64 `json:"install_timeout" label:"安装超时" prop:"select:if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0)" search:"="`
  115. FinalMaterialOrder
  116. }
  117. func (model FinalMaterialOrderMobile) GroupBy() string {
  118. return fmt.Sprintf("`%s`.`id`", model.TableName())
  119. }
  120. func (model FinalMaterialOrderMobile) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  121. if search, ok := data["search"]; ok {
  122. search = s.Param(fmt.Sprintf("%%%s%%", search))
  123. s.Where = append(s.Where, fmt.Sprintf("`%s`.`order_no` LIKE %s OR `finalsite`.`username` LIKE %s OR `finalsite`.`phone` LIKE %s OR `finalsite`.`village` LIKE %s OR `finalsite`.`address` LIKE %s OR `manager`.`username` LIKE %s OR `manager`.`phone` LIKE %s OR `supplier`.`name` LIKE %s OR concat(`finalsite`.`village`,`finalsite`.`address`,`finalsite`.`room_no`) LIKE %s", model.TableName(), search, search, search, search, search, search, search, search, search))
  124. }
  125. if settle, ok := data["settle"]; ok {
  126. if settleId, ok := db.ToInt64(settle); ok {
  127. var settle FinalMaterialSettle
  128. db.GetModel(map[string]interface{}{
  129. "id": settleId,
  130. "deleted_at": 0,
  131. }, &settle)
  132. if settle.ID != 0 {
  133. ids := strings.Split(settle.Orders, ",")
  134. s.Where = append(s.Where, fmt.Sprintf("`%s`.`id` in %s", model.TableName(), s.Param(ids)))
  135. }
  136. }
  137. }
  138. if _, ok := data["process"]; ok {
  139. s.Where = append(s.Where, fmt.Sprintf("`%s`.`process_id` != %s", model.TableName(), s.Param(0)))
  140. adminID := c.GetInt("adminID")
  141. adminIDs := s.Param(adminID)
  142. where := fmt.Sprintf("(`finalsite`.`manager_id` = %s AND `process`.`type` = 6 AND `process`.`check_at2` = 0) OR (`supplier`.`adminId` = %s AND `process`.`type` = 6 AND `process`.`check_at3` = 0) OR (`%s`.`created_id` = %s AND `process`.`type` = 7 AND `process`.`check_at2` = 0)", adminIDs, adminIDs, model.TableName(), adminIDs)
  143. if admin.CheckAuth([]string{"final:verify:audit"}, adminID) {
  144. where += " OR (`process`.`type` = 7 AND `process`.`check_at` = 0) OR (`process`.`type` = 12 AND `process`.`check_at` = 0)"
  145. }
  146. s.Where = append(s.Where, "("+where+")")
  147. }
  148. if _, ok := data["dcl"]; ok {
  149. adminID := c.GetInt("adminID")
  150. adminIDs := s.Param(adminID)
  151. dclWhere := fmt.Sprintf("(`finalsite`.`manager_id` = %s AND ((`%s`.`state` in (8,1,3,4,6) AND `%s`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at2` = 0) OR (`process`.`type` = 14 AND `process`.`check_at` = 0)))", adminIDs, model.TableName(), model.TableName())
  152. dclWhere += fmt.Sprintf(" OR (`supplier`.`adminId` = %s AND ((`%s`.`state` in (9,0,2,5,11) AND `%s`.`process_id` = 0) OR (`process`.`type` = 6 AND `process`.`check_at3` = 0)))", adminIDs, model.TableName(), model.TableName())
  153. dclWhere += fmt.Sprintf(" OR (`finalsite`.`project_leader_id` = %s AND `%s`.`state` = 7 AND `%s`.`process_id` = 0)", adminIDs, model.TableName(), model.TableName())
  154. dclWhere += fmt.Sprintf(" OR (`%s`.`created_id` = %s AND `process`.`type` = 7 AND `process`.`check_at2` = 0)", model.TableName(), adminIDs)
  155. if admin.CheckAuth([]string{"final:verify:audit"}, adminID) {
  156. dclWhere += " OR (`process`.`type` = 7 AND `process`.`check_at` = 0) OR (`process`.`type` = 12 AND `process`.`check_at` = 0)"
  157. }
  158. s.Where = append(s.Where, fmt.Sprintf("(%s)", dclWhere))
  159. }
  160. if starttime1s, ok := data["starttime1"]; ok {
  161. if starttime1, ok := db.ToInt64(starttime1s); ok {
  162. s.Where = append(s.Where, fmt.Sprintf("`finalsite`.`starttime` >= %s", s.Param(starttime1)))
  163. }
  164. }
  165. if starttime2s, ok := data["starttime2"]; ok {
  166. if starttime2, ok := db.ToInt64(starttime2s); ok {
  167. s.Where = append(s.Where, fmt.Sprintf("`finalsite`.`starttime` < %s", s.Param(starttime2+60*60*24)))
  168. }
  169. }
  170. if taketime1s, ok := data["taketime1"]; ok {
  171. if taketime1, ok := db.ToInt64(taketime1s); ok {
  172. s.Where = append(s.Where, fmt.Sprintf("`%s`.`take_time` >= %s", model.TableName(), s.Param(taketime1)))
  173. }
  174. }
  175. if taketime2s, ok := data["taketime2"]; ok {
  176. if taketime2, ok := db.ToInt64(taketime2s); ok {
  177. s.Where = append(s.Where, fmt.Sprintf("`%s`.`take_time` < %s", model.TableName(), s.Param(taketime2+60*60*24)))
  178. }
  179. }
  180. if state, _ := db.ToInt64(data["state"]); state != -1 {
  181. s.Where = append(s.Where, fmt.Sprintf("`%s`.`state` != %s", model.TableName(), s.Param(-1)))
  182. }
  183. if timeout, ok := db.ToInt64(data["timeout"]); ok {
  184. switch timeout {
  185. case 0:
  186. s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 0 AND if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600<zy_final_material_order.stock_time,1,0) = 0 AND if(zy_final_material_order.deliver_time>zy_final_material_order.receipt_date,1,0) = 0 AND if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 0)")
  187. case 1:
  188. s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 1 OR if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600<zy_final_material_order.stock_time,1,0) = 1 OR if(zy_final_material_order.deliver_time>zy_final_material_order.receipt_date,1,0) = 1 OR if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 1)")
  189. case 2:
  190. s.Where = append(s.Where, "(if(zy_final_material_order.measure_time-notice_measure_time>7*24*60*60,1,0) = 1)")
  191. case 3:
  192. s.Where = append(s.Where, "(if(zy_final_material_order.take_time+if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)*3600<zy_final_material_order.stock_time,1,0) = 1)")
  193. case 4:
  194. s.Where = append(s.Where, "(if(zy_final_material_order.deliver_time>zy_final_material_order.receipt_date,1,0) = 1)")
  195. case 5:
  196. s.Where = append(s.Where, "(if(zy_final_material_order.install_time>zy_final_material_order.install_date,1,0) = 1)")
  197. case 6:
  198. s.Where = append(s.Where, "(zy_final_material_order.report_timeout>0)")
  199. }
  200. }
  201. return model.FinalMaterialOrder.ListPrivilege(c, data, s)
  202. }
  203. func (model FinalMaterialOrderMobile) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  204. return append(model.FinalMaterialOrder.LeftJoin(data, s), db.JoinModel{
  205. Model: FinalSite{},
  206. As: "finalsite",
  207. On: []string{"`finalsite`.`id` = " + model.TableName() + ".`site_id`"},
  208. }, db.JoinModel{
  209. Model: FinalSupplier{},
  210. As: "supplier",
  211. On: []string{"`supplier`.`id` = " + model.TableName() + ".`supplier_id`"},
  212. }, db.JoinModel{
  213. Model: JoinShop{},
  214. As: "shop",
  215. On: []string{"`shop`.`id` = `finalsite`.`shop_id`"},
  216. }, db.JoinModel{
  217. Model: FinalMaterialOrderProcess{},
  218. As: "process",
  219. On: []string{"`process`.`id` = " + model.TableName() + ".`process_id`"},
  220. }, db.JoinModel{
  221. Model: FinalMaterialSettle{},
  222. As: "settle",
  223. On: []string{"`settle`.`id` = " + model.TableName() + ".`settle_id`"},
  224. }, db.JoinModel{
  225. Model: JoinAdmin{},
  226. As: "manager",
  227. On: []string{"`manager`.`id` = `finalsite`.`manager_id`"},
  228. }, db.JoinModel{
  229. Model: JoinAdmin{},
  230. As: "designer",
  231. On: []string{"`designer`.`id` = `finalsite`.`designer_id`"},
  232. }, db.JoinModel{
  233. Model: JoinAdmin{},
  234. As: "project_leader",
  235. On: []string{"`project_leader`.`id` = `finalsite`.`project_leader_id`"},
  236. }, db.JoinModel{
  237. Model: FinalPkg{},
  238. As: "finalpkg",
  239. On: []string{"`finalpkg`.`id` = `finalsite`.`pkg_id`"},
  240. })
  241. }
  242. func (model FinalMaterialOrderMobile) ListAfter(c *gin.Context, data map[string]interface{}, list []map[string]interface{}) []map[string]interface{} {
  243. ids := make([]int64, 0)
  244. idmap := make(map[int64]int)
  245. for i, v := range list {
  246. id, _ := db.ToInt64(v["id"])
  247. ids = append(ids, id)
  248. idmap[id] = i
  249. }
  250. if len(ids) == 0 {
  251. return list
  252. }
  253. datas, _ := db.GetModelMap(db.Type(FinalMaterialOrderItemMobile{}), map[string]interface{}{
  254. fmt.Sprintf("`%s`.`order_id` in", FinalMaterialOrderItemMobile{}.TableName()): ids,
  255. fmt.Sprintf("`%s`.`deleted_at`", FinalMaterialOrderItemMobile{}.TableName()): 0,
  256. }, nil)
  257. for _, v := range datas {
  258. id, _ := db.ToInt64(v["order_id"])
  259. if n, ok := idmap[id]; ok {
  260. items := make([]map[string]interface{}, 0)
  261. if is, ok := list[n]["items"].([]map[string]interface{}); ok {
  262. items = is
  263. }
  264. items = append(items, v)
  265. list[n]["items"] = items
  266. }
  267. }
  268. return list
  269. }
  270. func (model FinalMaterialOrderMobile) ExportSpan() []string {
  271. return []string{"items"}
  272. }
  273. func (model FinalMaterialOrderMobile) ExportFields() []db.ExportField {
  274. return []db.ExportField{
  275. {
  276. Label: "ID",
  277. Name: "id",
  278. },
  279. {
  280. Label: "订单号",
  281. Name: "order_no",
  282. Width: 30,
  283. },
  284. {
  285. Label: "门店",
  286. Name: "shop_name",
  287. Width: 20,
  288. },
  289. {
  290. Label: "工地",
  291. Name: "address",
  292. Width: 30,
  293. },
  294. {
  295. Label: "套餐",
  296. Name: "pkg_name",
  297. Width: 10,
  298. },
  299. {
  300. Label: "开工日期",
  301. Name: "starttime",
  302. Width: 15,
  303. },
  304. {
  305. Label: "业主",
  306. Name: "username",
  307. Width: 25,
  308. },
  309. {
  310. Label: "设计师",
  311. Name: "designer_name",
  312. Width: 25,
  313. },
  314. {
  315. Label: "项目经理",
  316. Name: "manager_name",
  317. Width: 25,
  318. },
  319. {
  320. Label: "工程队长",
  321. Name: "project_leader_name",
  322. Width: 25,
  323. },
  324. {
  325. Label: "材料商",
  326. Name: "supplier",
  327. Width: 15,
  328. },
  329. {
  330. Label: "材料名称",
  331. Name: "items.mat_name",
  332. Width: 50,
  333. },
  334. {
  335. Label: "单价",
  336. Name: "items.price",
  337. },
  338. {
  339. Label: "数量",
  340. Name: "items.num",
  341. },
  342. {
  343. Label: "总价",
  344. Name: "items.total",
  345. },
  346. {
  347. Label: "备注",
  348. Name: "items.remark",
  349. },
  350. {
  351. Label: "金额",
  352. Name: "total",
  353. },
  354. {
  355. Label: "下单时间",
  356. Name: "take_time",
  357. Width: 20,
  358. },
  359. {
  360. Label: "备货时间",
  361. Name: "stock_time",
  362. Width: 20,
  363. },
  364. {
  365. Label: "通知配送时间",
  366. Name: "notice_time",
  367. Width: 20,
  368. },
  369. {
  370. Label: "送达时间",
  371. Name: "deliver_time",
  372. Width: 20,
  373. },
  374. {
  375. Label: "完成时间",
  376. Name: "over_time",
  377. Width: 20,
  378. },
  379. {
  380. Label: "状态",
  381. Name: "state",
  382. },
  383. {
  384. Label: "结算状态",
  385. Name: "settle_state",
  386. },
  387. {
  388. Label: "超时状态",
  389. Name: "timeout_state",
  390. },
  391. }
  392. }
  393. func (FinalMaterialOrderMobile) ExportValue(row map[string]interface{}, rowIndex int, field db.ExportField, data []map[string]interface{}) string {
  394. states := []string{"已取消", "待备货", "已备货", "待配送", "待收货", "已收货", "待安装", "待验收", "已完成", "已下单", "待测量", "待审核", "待结算", "已结算"}
  395. switch field.Name {
  396. case "address":
  397. worksite := db.ToString(row["address"]) + " " + db.ToString(row["village"]) + "" + db.ToString(row["room_no"])
  398. area, _ := db.ToFloat64(row["area"])
  399. if area != 0 {
  400. worksite += " " + db.ToString(area) + "㎡"
  401. }
  402. return worksite
  403. case "starttime":
  404. starttime, _ := db.ToInt64(row["starttime"])
  405. if starttime == 0 {
  406. return ""
  407. }
  408. t := time.Unix(starttime, 0).Local()
  409. return t.Format("2006-01-02")
  410. case "username":
  411. return db.ToString(row["username"]) + " " + db.ToString(row["phone"])
  412. case "designer_name":
  413. return db.ToString(row["designer_name"]) + " " + db.ToString(row["designer_phone"])
  414. case "manager_name":
  415. return db.ToString(row["manager_name"]) + " " + db.ToString(row["manager_phone"])
  416. case "project_leader_name":
  417. return db.ToString(row["project_leader_name"]) + " " + db.ToString(row["project_leader_phone"])
  418. case "items.num":
  419. return db.ToString(row["items.num"]) + " " + db.ToString(row["items.unit"])
  420. case "take_time":
  421. take_time, _ := db.ToInt64(row["take_time"])
  422. if take_time == 0 {
  423. return ""
  424. }
  425. t := time.Unix(take_time, 0).Local()
  426. return t.Format("2006-01-02 15:04")
  427. case "stock_time":
  428. stock_time, _ := db.ToInt64(row["stock_time"])
  429. if stock_time == 0 {
  430. return ""
  431. }
  432. t := time.Unix(stock_time, 0).Local()
  433. return t.Format("2006-01-02 15:04")
  434. case "notice_time":
  435. notice_time, _ := db.ToInt64(row["notice_time"])
  436. if notice_time == 0 {
  437. return ""
  438. }
  439. t := time.Unix(notice_time, 0).Local()
  440. return t.Format("2006-01-02 15:04")
  441. case "deliver_time":
  442. deliver_time, _ := db.ToInt64(row["deliver_time"])
  443. if deliver_time == 0 {
  444. return ""
  445. }
  446. t := time.Unix(deliver_time, 0).Local()
  447. return t.Format("2006-01-02 15:04")
  448. case "over_time":
  449. over_time, _ := db.ToInt64(row["over_time"])
  450. if over_time == 0 {
  451. return ""
  452. }
  453. t := time.Unix(over_time, 0).Local()
  454. return t.Format("2006-01-02 15:04")
  455. case "state":
  456. if state, ok := db.ToInt64(row["state"]); ok {
  457. return states[state+1]
  458. }
  459. return ""
  460. case "settle_state":
  461. sstates := []string{"已驳回", "", "", "待财务审核", "待店长审核", "待财务付款", "已完成"}
  462. if settle_state, ok := db.ToInt64(row["settle_state"]); ok {
  463. return sstates[settle_state+1]
  464. }
  465. return ""
  466. case "timeout_state":
  467. measure_timeout, _ := db.ToInt64(row["measure_timeout"])
  468. stock_timeout, _ := db.ToInt64(row["stock_timeout"])
  469. receipt_timeout, _ := db.ToInt64(row["receipt_timeout"])
  470. install_timeout, _ := db.ToInt64(row["install_timeout"])
  471. report_timeout, _ := db.ToInt64(row["report_timeout"])
  472. states := []string{}
  473. if report_timeout > 0 {
  474. states = append(states, "报备超时"+db.ToString(report_timeout)+"次")
  475. }
  476. if measure_timeout == 1 {
  477. states = append(states, "量尺超时")
  478. }
  479. if stock_timeout == 1 {
  480. states = append(states, "备货超时")
  481. }
  482. if receipt_timeout == 1 {
  483. states = append(states, "配送超时")
  484. }
  485. if install_timeout == 1 {
  486. states = append(states, "安装超时")
  487. }
  488. return strings.Join(states, ",")
  489. }
  490. return db.ToString(row[field.Name])
  491. }
  492. type FinalMaterialOrderSupplier struct {
  493. FinalMaterialOrderMobile
  494. }
  495. func (model FinalMaterialOrderSupplier) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  496. if !admin.IsSuperAdmin(c.GetInt("adminID")) {
  497. adminID := s.Param(c.GetInt("adminID"))
  498. where := fmt.Sprintf("`supplier`.`adminId` = %s OR `%s`.`created_id` = %s OR `finalsite`.`manager_id` = %s OR `finalsite`.`project_leader_id` = %s OR `finalsite`.`created_id` = %s", adminID, model.TableName(), adminID, adminID, adminID, adminID)
  499. if admin.CheckAuth([]string{"final:verify"}, c.GetInt("adminID")) {
  500. if admin.CheckAuth([]string{"final:verify:manager"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:finance"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:customer"}, c.GetInt("adminID")) || admin.CheckAuth([]string{"final:verify:assistant"}, c.GetInt("adminID")) {
  501. info, _ := admin.GetInfoByID(c.GetInt("adminID"), nil, nil)
  502. if info == nil {
  503. return false
  504. }
  505. where = where + fmt.Sprintf(" OR FIND_IN_SET(`finalsite`.`shop_id`, %s)", s.Param(info.ShopIds))
  506. }
  507. if admin.CheckAuth([]string{"final:verify:audit"}, c.GetInt("adminID")) {
  508. where = fmt.Sprintf("%s OR `manager`.`audit_id` = %s OR `manager`.`audit_id` = %s OR ISNULL(`manager`.`audit_id`)", where, s.Param(c.GetInt("adminID")), s.Param(0))
  509. }
  510. }
  511. s.Where = append(s.Where, fmt.Sprintf("(%s)", where))
  512. }
  513. return model.FinalMaterialOrderMobile.ListPrivilege(c, data, s)
  514. }
  515. func (FinalMaterialOrderSupplier) Count() bool {
  516. return true
  517. }
  518. func SendMaterialMessage(adminID int, orderNo string, orderId int64, address string, text string) error {
  519. logger.Sugar.Infof("SendMaterialMessage, send: %v %v %v %v %v", adminID, orderNo, orderId, address, text)
  520. client, err := mp.NewClient(1)
  521. if err != nil {
  522. return err
  523. }
  524. adminInfo, err := admin.GetInfoByID(adminID, nil, nil)
  525. if err != nil {
  526. return err
  527. }
  528. if adminInfo == nil || adminInfo.OpenId == "" {
  529. return nil
  530. }
  531. url := ""
  532. if orderId != 0 {
  533. url = "https://jz.nczyzs.com/final/#/order/" + db.ToString(orderId)
  534. }
  535. ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{
  536. "character_string1": map[string]interface{}{
  537. "value": utils.SubStr(orderNo, 0, 32),
  538. },
  539. "thing2": map[string]interface{}{
  540. "value": utils.SubStr(address, 0, 20),
  541. },
  542. "thing5": map[string]interface{}{
  543. "value": utils.SubStr(text, 0, 20),
  544. },
  545. })
  546. logger.Sugar.Infof("SendMaterialMessage, ret: %v %v", ret, err)
  547. return err
  548. }
  549. type FinalMaterialOrderRemindModel struct {
  550. ID int64 `json:"id" prop:"add:false"`
  551. OrderNo string `json:"order_no" label:"订单号" type:"string"`
  552. SupplierId int64 `json:"supplier_id" label:"材料商ID" type:"int"`
  553. ReceiptDate int64 `json:"receipt_date" label:"配送日期" type:"int"`
  554. StockHour int64 `json:"stock_hour" label:"备货小时" type:"int" prop:"select:if(zy_final_material_order.is_custom=1,supplier.custom_stock_hour,supplier.stock_hour)"`
  555. SupplierAdminId int64 `json:"supplier_admin_id" type:"int" prop:"select:supplier.adminId"`
  556. Village string `json:"village" label:"小区名称" prop:"select:finalsite.village"`
  557. Address string `json:"address" label:"房屋地址" prop:"select:finalsite.address"`
  558. RoomNo string `json:"room_no" label:"楼栋房号" prop:"select:finalsite.room_no"`
  559. ManagerId int64 `json:"manager_id" label:"项目经理" prop:"select:finalsite.manager_id"`
  560. FinalMaterialOrderMobile
  561. }
  562. func FinalMaterialOrderRemind() {
  563. t := time.Now().Unix()
  564. orders := make([]FinalMaterialOrderRemindModel, 0)
  565. s := db.ModelQuery(db.Type(&orders), map[string]interface{}{}, true)
  566. db.WhereParse(&s, map[string]interface{}{
  567. "state": 2,
  568. "process_id": 0,
  569. "deleted_at": 0,
  570. })
  571. s.Where = append(s.Where, fmt.Sprintf("(`%s`.`type` = 0 and `%s`.`receipt_date` < %s) or (`%s`.`type` = 1 and `%s`.`receipt_date` < %s)", FinalMaterialOrderRemindModel{}.TableName(), FinalMaterialOrderRemindModel{}.TableName(), s.Param(t+2*3600), FinalMaterialOrderRemindModel{}.TableName(), FinalMaterialOrderRemindModel{}.TableName(), s.Param(t+6*3600)))
  572. query, params := s.Query()
  573. db.Query(query, params, &orders, FinalMaterialOrderRemindModel{}.DB())
  574. for _, order := range orders {
  575. address := order.Address
  576. if order.Village != " " {
  577. address += " " + order.Village
  578. }
  579. if order.RoomNo != " " {
  580. address += " " + order.RoomNo
  581. }
  582. msg := "您的待配送订单即将超时,请及时配送"
  583. if t >= order.ReceiptDate {
  584. msg = "您的待配送订单已超时,请及时配送"
  585. }
  586. SendMaterialMessage(int(order.SupplierAdminId), order.OrderNo, order.ID, address, msg)
  587. }
  588. }
  589. // 超时提醒
  590. func FinalSiteWorkCheckExtensionAndSenWxMsg() {
  591. var matPickWork []MatPickWork
  592. db.GetModel(map[string]interface{}{
  593. "deleted_at": 0,
  594. "example_at <": gtime.Now().Format("Y-m-d"),
  595. "item_status IN ": []int{0, 4}, //节点状态:0:未确认 1:已完成 2超时完成 3 超时未完成 4:验收未通过'
  596. }, &matPickWork)
  597. for _, work := range matPickWork {
  598. //修改成超时未完成
  599. err := db.UpdateModel(db.Type(MatPickWork{}), work.ID, map[string]interface{}{
  600. "item_status": 3, //超时未完成
  601. })
  602. if err != nil {
  603. continue
  604. }
  605. msg := fmt.Sprintf("工地:%s | 项目:%s 工作已超时,请及时处理,", work.Village, work.PickName)
  606. var toUser int
  607. if work.WorkerId != 0 {
  608. toUser = gconv.Int(work.WorkerId)
  609. SendSiteWorkMessage(toUser, work.SiteId, msg)
  610. }
  611. }
  612. fmt.Println("End final.FinalSiteWorkCheckExtensionAndSenWxMsg...")
  613. }
  614. // 快超时提醒 提前2天
  615. func FinalSiteWorkCheckAboutToExtensionAndSenWxMsg() {
  616. var matPickWork []MatPickWork
  617. db.GetModel(map[string]interface{}{
  618. "example_at > ": gtime.Now().Format("Y-m-d"),
  619. "example_at <= ": gtime.Now().AddDate(0, 0, 2).Format("Y-m-d"),
  620. "deleted_at": 0,
  621. "item_status IN ": []int{0, 4}, //节点状态:0:未确认 1:已完成 2超时完成 3 超时未完成 4:验收未通过'
  622. }, &matPickWork)
  623. fmt.Println(len(matPickWork))
  624. for _, work := range matPickWork {
  625. msg := fmt.Sprintf("工地:%s | 项目:%s 工作即将超时,请及时处理,", work.Village, work.PickName)
  626. var toUser int
  627. if work.WorkerId != 0 {
  628. toUser = gconv.Int(work.WorkerId)
  629. SendSiteWorkMessage(toUser, work.SiteId, msg)
  630. }
  631. }
  632. fmt.Println("End final.FinalSiteWorkCheckAboutToExtensionAndSenWxMsg...")
  633. }
  634. type FinalMaterialOrderExport struct {
  635. SettleId int64 `json:"settle_id" label:"结算流程" type:"int" prop:"add:false" default:"0" search:"="`
  636. Total float64 `json:"total" label:"金额" type:"float" prop:"add:false select:sum(zy_final_material_order.total)" default:"0"`
  637. Village string `json:"village" label:"小区名称" prop:"select:finalsite.village" search:"like"`
  638. Address string `json:"address" label:"房屋地址" prop:"select:finalsite.address" search:"like"`
  639. RoomNo string `json:"room_no" label:"楼栋房号" prop:"select:finalsite.room_no" search:"like"`
  640. AccountName string `json:"account_name" prop:"select:account.account_name"`
  641. AccountBank string `json:"account_bank" prop:"select:account.account_bank"`
  642. AccountNo string `json:"account_no" prop:"select:account.account_no"`
  643. db.BaseModel
  644. }
  645. func (FinalMaterialOrderExport) TableName() string {
  646. return "zy_final_material_order"
  647. }
  648. func (model FinalMaterialOrderExport) GroupBy() string {
  649. return fmt.Sprintf("`%s`.`id`", model.TableName())
  650. }
  651. func (model FinalMaterialOrderExport) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  652. return true
  653. }
  654. func (model FinalMaterialOrderExport) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  655. return []db.JoinModel{{
  656. Model: FinalSite{},
  657. As: "finalsite",
  658. On: []string{"`finalsite`.`id` = " + model.TableName() + ".`site_id`"},
  659. }, {
  660. Model: FinalMaterialSettle{},
  661. As: "settle",
  662. On: []string{"`settle`.`id` = " + model.TableName() + ".`settle_id`"},
  663. }, {
  664. Model: FinalSupplierAccount{},
  665. As: "account",
  666. On: []string{"`account`.`id` = `settle`.`account_id`"},
  667. }}
  668. }
  669. func (model FinalMaterialOrderExport) ExportFields() []db.ExportField {
  670. return []db.ExportField{
  671. {
  672. Label: "项目名称",
  673. Name: "address",
  674. Width: 30,
  675. },
  676. {
  677. Label: "金额",
  678. Name: "total",
  679. Width: 20,
  680. },
  681. {
  682. Label: "支付对象",
  683. Name: "account_name",
  684. Width: 30,
  685. },
  686. {
  687. Label: "开户行",
  688. Name: "account_bank",
  689. Width: 20,
  690. },
  691. {
  692. Label: "账号",
  693. Name: "account_no",
  694. Width: 30,
  695. },
  696. }
  697. }
  698. func (FinalMaterialOrderExport) ExportValue(row map[string]interface{}, rowIndex int, field db.ExportField, data []map[string]interface{}) string {
  699. switch field.Name {
  700. case "address":
  701. worksite := db.ToString(row["address"]) + " " + db.ToString(row["village"]) + "" + db.ToString(row["room_no"])
  702. return worksite
  703. }
  704. return db.ToString(row[field.Name])
  705. }