final_settle_process.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. package final
  2. import (
  3. "errors"
  4. "fmt"
  5. "math"
  6. "zhiyuan/pkg/db"
  7. "zhiyuan/pkg/logger"
  8. "zhiyuan/pkg/utils"
  9. "zhiyuan/pkg/weixin/mp"
  10. "zhiyuan/services/admin"
  11. "github.com/gin-gonic/gin"
  12. )
  13. type FinalSettleProcess struct {
  14. ID int64 `json:"id" prop:"add:false"`
  15. SettleId int64 `json:"settle_id" label:"结算ID" type:"int"`
  16. CollectId int64 `json:"collect_id" label:"汇总" type:"int"`
  17. Explain string `json:"explain" label:"说明" type:"string" search:"like"`
  18. Pictures string `json:"pictures" label:"图片" type:"string" search:"like"`
  19. Type int64 `json:"type" label:"类型" type:"int" prop:"add" default:"0"`
  20. Signature string `json:"signature" label:"签名" prop:"add" type:"string"`
  21. Total float64 `json:"total" label:"金额" type:"float" default:"0"`
  22. State int64 `json:"state" label:"状态" type:"int" prop:"add" default:"0"`
  23. CreatedId int64 `json:"created_id" label:"创建人员" type:"int" prop:"add:false" search:"="`
  24. CreatedName string `json:"created_name" prop:"add:false select:created.username"`
  25. CreatedPhone string `json:"created_phone" prop:"add:false select:created.phone"`
  26. CreatedHeadimgurl string `json:"created_headimgurl" prop:"add:false select:created.headimgurl"`
  27. DeletedAt int64 `json:"deleted_at" prop:"add:false select:false"`
  28. CreatedAt int64 `json:"created_at" prop:"add:false"`
  29. UpdatedAt int64 `json:"updated_at" prop:"add:false"`
  30. db.BaseModel
  31. }
  32. func (FinalSettleProcess) TableName() string {
  33. return "zy_final_settle_process"
  34. }
  35. func (model FinalSettleProcess) ListPrivilege(c *gin.Context, data map[string]interface{}, s *db.Select) bool {
  36. settle_id, _ := db.ToInt64(data["settle_id"])
  37. collect_id, _ := db.ToInt64(data["collect_id"])
  38. if settle_id != 0 && collect_id != 0 {
  39. s.Where = append(s.Where, fmt.Sprintf("`%s`.`settle_id` = %s OR `%s`.`collect_id` = %s", model.TableName(), s.Param(settle_id), model.TableName(), s.Param(collect_id)))
  40. } else if settle_id != 0 {
  41. s.Where = append(s.Where, fmt.Sprintf("`%s`.`settle_id` = %s", model.TableName(), s.Param(settle_id)))
  42. } else if collect_id != 0 {
  43. s.Where = append(s.Where, fmt.Sprintf("`%s`.`collect_id` = %s", model.TableName(), s.Param(collect_id)))
  44. }
  45. return true
  46. }
  47. func (FinalSettleProcess) OnePrivilege(c *gin.Context, id int64) bool {
  48. return true
  49. }
  50. func SendSettleMessage(adminID int, settleId int64, address string, text string) error {
  51. logger.Sugar.Infof("SendSettleMessage, send: %v %v %v %v", adminID, settleId, address, text)
  52. client, err := mp.NewClient(1)
  53. if err != nil {
  54. return err
  55. }
  56. adminInfo, err := admin.GetInfoByID(adminID, nil, nil)
  57. if err != nil {
  58. return err
  59. }
  60. if adminInfo == nil || adminInfo.OpenId == "" {
  61. return nil
  62. }
  63. url := ""
  64. if settleId != 0 {
  65. url = "https://jz.nczyzs.com/final/#/settle/" + db.ToString(settleId)
  66. }
  67. ret, err := client.SendTemplateMessage(adminInfo.OpenId, "0tdzToVtXoCUrafmN-ub9J69HKKCfUWEsCan-WkuPKk", url, map[string]interface{}{
  68. "character_string1": map[string]interface{}{
  69. "value": utils.SubStr(db.ToString(settleId), 0, 32),
  70. },
  71. "thing2": map[string]interface{}{
  72. "value": utils.SubStr(address, 0, 20),
  73. },
  74. "thing5": map[string]interface{}{
  75. "value": utils.SubStr(text, 0, 20),
  76. },
  77. })
  78. logger.Sugar.Infof("SendMaterialMessage, ret: %v %v", ret, err)
  79. return err
  80. }
  81. func (FinalSettleProcess) AddPrivilege(c *gin.Context, data map[string]interface{}, post map[string]interface{}) error {
  82. data["created_id"] = c.GetInt("adminID")
  83. typ, _ := db.ToInt64(data["type"])
  84. siteID, _ := db.ToInt64(post["site_id"])
  85. settleID, _ := db.ToInt64(data["settle_id"])
  86. collectID, _ := db.ToInt64(data["collect_id"])
  87. state, _ := db.ToInt64(data["state"])
  88. total, _ := db.ToFloat64(data["total"])
  89. pictures := db.ToString(post["pictures"])
  90. if siteID != 0 {
  91. if pictures == "" {
  92. return errors.New("请上传业主签字的竣工结算单")
  93. }
  94. var model FinalSite
  95. db.GetModel(map[string]interface{}{
  96. "id": siteID,
  97. }, &model)
  98. totals := float64(0)
  99. managerPrice := float64(0)
  100. prices := make([]FinalManagerPrice, 0)
  101. db.GetModel(map[string]interface{}{
  102. "site_id": siteID,
  103. "deleted_at": 0,
  104. }, &prices)
  105. if len(prices) == 0 {
  106. return errors.New("未录承包额")
  107. }
  108. for _, v := range prices {
  109. managerPrice += v.Price
  110. }
  111. /*changePrice := float64(0)
  112. changes := make([]FinalSiteChange, 0)
  113. db.GetModel(map[string]interface{}{
  114. "site_id": siteID,
  115. "deleted_at": 0,
  116. }, &changes)
  117. for _, v := range changes {
  118. if v.Type == 1 {
  119. if v.Type2 == 1 {
  120. changePrice += v.Amount
  121. } else if v.Type2 == 2 {
  122. changePrice -= v.Amount
  123. }
  124. }
  125. }*/
  126. workerPrice := float64(0)
  127. type FinalSiteTableCollects struct {
  128. ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="`
  129. Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"`
  130. State int64 `json:"state" label:"状态" type:"int"`
  131. Deduct int64 `json:"deduct" type:"int" prop:"select:finaltype.deduct"`
  132. FinalSiteTableCollect
  133. }
  134. models := make([]FinalSiteTableCollects, 0)
  135. db.GetModel(map[string]interface{}{
  136. "site_id": siteID,
  137. "deleted_at": 0,
  138. }, &models)
  139. //if len(models) == 0 {
  140. // return errors.New("没有权限")
  141. //}
  142. for _, v := range models {
  143. if v.State == -1 {
  144. continue
  145. }
  146. if v.State < 3 {
  147. return errors.New("工人结算未完成")
  148. }
  149. if v.Deduct == 0 {
  150. workerPrice += v.Total
  151. }
  152. }
  153. auxiliaryPrice := float64(0)
  154. type FinalMaterialCollects struct {
  155. Budget float64 `json:"budget" label:"预算" type:"float" prop:"edit" default:"0"`
  156. State int64 `json:"state" label:"状态" type:"int"`
  157. FinalMaterialMobile
  158. }
  159. materials := make([]FinalMaterialCollects, 0)
  160. db.GetModel(map[string]interface{}{
  161. "site_id": siteID,
  162. "deleted_at": 0,
  163. }, &materials)
  164. //if len(materials) == 0 {
  165. // return errors.New("没有权限")
  166. //}
  167. for _, v := range materials {
  168. if v.Budget != 0 && v.State != 1 {
  169. return errors.New("辅材未下单")
  170. }
  171. }
  172. orders := make([]FinalMaterialOrder, 0)
  173. db.GetModel(map[string]interface{}{
  174. "site_id": siteID,
  175. "deleted_at": 0,
  176. }, &orders)
  177. for _, v := range orders {
  178. if v.State == -1 {
  179. continue
  180. }
  181. if v.State != 7 && v.State != 11 && v.State != 12 {
  182. return errors.New("材料订单未完成")
  183. }
  184. if v.Type == 0 {
  185. auxiliaryPrice += v.Total
  186. }
  187. }
  188. //managerPrice = managerPrice + changePrice*0.9*0.65
  189. totals = math.Round(managerPrice - workerPrice - auxiliaryPrice)
  190. settleid, err := db.InsertModel(db.Type(FinalSettle{}), map[string]interface{}{
  191. "site_id": siteID,
  192. "manager_id": model.ManagerId,
  193. "total": totals,
  194. "manager_price": managerPrice,
  195. "worker_price": workerPrice,
  196. "auxiliary_price": auxiliaryPrice,
  197. "state": 1,
  198. })
  199. if err == nil {
  200. data["settle_id"] = settleid
  201. } else {
  202. return errors.New("没有权限")
  203. }
  204. } else if settleID != 0 {
  205. var model FinalSettle
  206. db.GetModel(map[string]interface{}{
  207. "id": settleID,
  208. }, &model)
  209. if model.ID == 0 || model.State != typ {
  210. return errors.New("没有权限")
  211. }
  212. s := model.State + 1
  213. if s > 4 {
  214. return errors.New("没有权限")
  215. }
  216. data = map[string]interface{}{
  217. "state": s,
  218. }
  219. if state == 0 {
  220. if typ == 0 {
  221. if pictures == "" {
  222. return errors.New("请上传业主签字的竣工结算单")
  223. }
  224. totals := float64(0)
  225. managerPrice := float64(0)
  226. prices := make([]FinalManagerPrice, 0)
  227. db.GetModel(map[string]interface{}{
  228. "site_id": model.SiteId,
  229. "deleted_at": 0,
  230. }, &prices)
  231. if len(prices) == 0 {
  232. return errors.New("未录承包额")
  233. }
  234. for _, v := range prices {
  235. managerPrice += v.Price
  236. }
  237. /*changePrice := float64(0)
  238. changes := make([]FinalSiteChange, 0)
  239. db.GetModel(map[string]interface{}{
  240. "site_id": siteID,
  241. "deleted_at": 0,
  242. }, &changes)
  243. for _, v := range changes {
  244. if v.Type == 1 {
  245. if v.Type2 == 1 {
  246. changePrice += v.Amount
  247. } else if v.Type2 == 2 {
  248. changePrice -= v.Amount
  249. }
  250. }
  251. }*/
  252. workerPrice := float64(0)
  253. type FinalSiteTableCollects struct {
  254. ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="`
  255. Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"`
  256. State int64 `json:"state" label:"状态" type:"int"`
  257. Deduct int64 `json:"deduct" type:"int" prop:"select:finaltype.deduct"`
  258. FinalSiteTableCollect
  259. }
  260. models := make([]FinalSiteTableCollects, 0)
  261. db.GetModel(map[string]interface{}{
  262. "site_id": model.SiteId,
  263. "deleted_at": 0,
  264. }, &models)
  265. //if len(models) == 0 {
  266. // return errors.New("没有权限")
  267. //}
  268. for _, v := range models {
  269. if v.State == -1 {
  270. continue
  271. }
  272. if v.State != 5 {
  273. return errors.New("工人结算未完成")
  274. }
  275. if v.Deduct == 0 {
  276. workerPrice += v.Total
  277. }
  278. }
  279. auxiliaryPrice := float64(0)
  280. type FinalMaterialCollects struct {
  281. Budget float64 `json:"budget" label:"预算" type:"float" prop:"edit" default:"0"`
  282. State int64 `json:"state" label:"状态" type:"int"`
  283. FinalMaterialMobile
  284. }
  285. materials := make([]FinalMaterialCollects, 0)
  286. db.GetModel(map[string]interface{}{
  287. "site_id": model.SiteId,
  288. "deleted_at": 0,
  289. }, &materials)
  290. //if len(materials) == 0 {
  291. // return errors.New("没有权限")
  292. //}
  293. for _, v := range materials {
  294. if v.Budget != 0 && v.State != 1 {
  295. return errors.New("辅材未下单")
  296. }
  297. }
  298. orders := make([]FinalMaterialOrder, 0)
  299. db.GetModel(map[string]interface{}{
  300. "site_id": model.SiteId,
  301. "deleted_at": 0,
  302. }, &orders)
  303. for _, v := range orders {
  304. if v.State == -1 {
  305. continue
  306. }
  307. if v.State != 7 && v.State != 11 && v.State != 12 {
  308. return errors.New("材料订单未完成")
  309. }
  310. if v.Type == 0 {
  311. auxiliaryPrice += v.Total
  312. }
  313. }
  314. //managerPrice = managerPrice + changePrice*0.9*0.65
  315. totals = math.Round(managerPrice - workerPrice - auxiliaryPrice)
  316. data["total"] = totals
  317. data["manager_price"] = managerPrice
  318. data["worker_price"] = workerPrice
  319. data["auxiliary_price"] = auxiliaryPrice
  320. }
  321. if typ == 1 {
  322. data["subsidy_price"] = total
  323. data["total"] = math.Round(model.ManagerPrice - model.WorkerPrice - model.AuxiliaryPrice + total)
  324. }
  325. } else {
  326. data["state"] = 0
  327. }
  328. err := db.UpdateModel(db.Type(model), settleID, data)
  329. if err != nil {
  330. return errors.New("没有权限")
  331. }
  332. } else if collectID != 0 {
  333. var model FinalSiteCollect
  334. db.GetModel(map[string]interface{}{
  335. "id": collectID,
  336. }, &model)
  337. if model.ID == 0 || model.State+1 != typ {
  338. return errors.New("没有权限")
  339. }
  340. if state != 0 {
  341. return errors.New("没有权限")
  342. }
  343. s := model.State + 1
  344. err := db.UpdateModel(db.Type(model), collectID, map[string]interface{}{
  345. "state": s,
  346. })
  347. if err != nil {
  348. return errors.New("没有权限")
  349. }
  350. err = db.UpdateModels(db.Type(FinalSettle{}), map[string]interface{}{
  351. "collect_id": collectID,
  352. }, map[string]interface{}{
  353. "state": s + 1,
  354. })
  355. if err != nil {
  356. return errors.New("没有权限")
  357. }
  358. } else {
  359. return errors.New("没有权限")
  360. }
  361. return nil
  362. }
  363. func (FinalSettleProcess) AddAfter(c *gin.Context, id int64, post map[string]interface{}, data map[string]interface{}) {
  364. var process FinalSettleProcess
  365. db.GetModel(map[string]interface{}{
  366. "id": id,
  367. "deleted_at": 0,
  368. }, &process)
  369. if process.Type == 0 || process.Type == 1 {
  370. var model FinalSettle
  371. db.GetModel(map[string]interface{}{
  372. "id": process.SettleId,
  373. }, &model)
  374. if model.ID != 0 {
  375. var site FinalSite
  376. db.GetModel(map[string]interface{}{
  377. "id": model.SiteId,
  378. "deleted_at": 0,
  379. }, &site)
  380. address := site.Address
  381. if site.Village != " " {
  382. address += " " + site.Village
  383. }
  384. if site.RoomNo != " " {
  385. address += " " + site.RoomNo
  386. }
  387. if process.Type == 0 {
  388. SendSettleMessage(599, model.ID, address, "项目经理已申请结算,请操作回访")
  389. //SendSettleMessage(54, model.ID, address, "项目经理已申请结算,请操作回访")
  390. SendSettleMessage(1557, model.ID, address, "项目经理已申请结算,请操作回访")
  391. } else if process.Type == 1 {
  392. if process.State == 0 {
  393. SendSettleMessage(int(site.ManagerId), model.ID, address, "请确认结算金额")
  394. } else {
  395. SendSettleMessage(int(site.ManagerId), model.ID, address, "已驳回,请重新提交")
  396. }
  397. }
  398. }
  399. }
  400. }
  401. func (FinalSettleProcess) Page() bool {
  402. return false
  403. }
  404. func (model FinalSettleProcess) LeftJoin(data map[string]interface{}, s *db.Select) []db.JoinModel {
  405. return []db.JoinModel{
  406. {
  407. Model: JoinAdmin{},
  408. As: "created",
  409. On: []string{"`created`.`id` = " + model.TableName() + ".`created_id`"},
  410. },
  411. }
  412. }