contract_service.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * @description: 合同数据相关操作
  3. * @Author: CP
  4. * @Date: 2020-10-27 11:28:24
  5. * @FilePath: \construction_management\services\contract_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "fmt"
  11. "html"
  12. "log"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/models"
  21. "go.mod/web/viewmodels"
  22. )
  23. //定义项目用户Service接口
  24. type ContractService interface {
  25. ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  26. ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  27. ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  28. ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  29. ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  30. ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error)
  31. ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error)
  32. ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error)
  33. ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error)
  34. ValidRuleContractRetrunAdd(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  35. ValidRuleContractRetrun(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  36. ValidRuleContractRetrunDel(ctx iris.Context) (*viewmodels.ContractsReturn, error)
  37. Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract
  38. GetSectionTreeContract(attribution string, bidsectionId int, projectId int) []*viewmodels.Contracts
  39. GetSecionTree(bidsectionId int, projectId int) *viewmodels.TreeSectionContract
  40. SetSection(templateNumber int, bidsectionId int, projectIdInt int) error
  41. SectionAdd(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  42. SectionSave(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  43. UpdateSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  44. SectionDelete(treeId int, bidsectionId int, projectId int) error
  45. MoveDepth(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  46. MoveSerial(sectionData *viewmodels.TreeSectionContract, bidsectionId int, projectId int) error
  47. GetContract(contractId int) *viewmodels.Contracts
  48. Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  49. Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error
  50. Delete(projectId int, bidsectionId int, treeId int, id int) error
  51. Close(projectId int, bidsectionId int, treeId int, id int) error
  52. Unlock(projectId int, bidsectionId int, treeId int, id int) error
  53. ReturnCreate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, projectAccountId int) error
  54. ReturnUpdate(returnData *viewmodels.ContractsReturn, projectId int, bidsectionId int, contractsId int, id int) error
  55. ReturnAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsReturn
  56. ReturnDelete(projectId int, bidsectionId int, contractsId int, id int) error
  57. }
  58. //返回service操作类
  59. type contractService struct {
  60. treeContractDao *dao.TreeContractDao
  61. contractDao *dao.ContractDao
  62. contractReturnDao *dao.ContractReturnDao
  63. treeDao *dao.TreeDao
  64. }
  65. //创建项目用户service
  66. func NewContractService() ContractService {
  67. return &contractService{
  68. treeContractDao: dao.NewTreeContractDao(datasource.InstanceDbMaster()),
  69. contractDao: dao.NewContractDao(datasource.InstanceDbMaster()),
  70. contractReturnDao: dao.NewContractReturnDao(datasource.InstanceDbMaster()),
  71. treeDao: dao.NewTreeDao(datasource.InstanceDbMaster()),
  72. }
  73. }
  74. // 升级降级规则验证
  75. func (s *contractService) ValidRuleDepth(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  76. treeSectionVaild := &viewmodels.TreeSectionContract{}
  77. err := ctx.ReadJSON(treeSectionVaild)
  78. if err != nil {
  79. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  80. return treeSectionVaild, err
  81. }
  82. err = treeSectionVaild.ValidateDepth()
  83. if err != nil {
  84. log.Println("参数验证错误, error=", err)
  85. return treeSectionVaild, err
  86. }
  87. return treeSectionVaild, nil
  88. }
  89. // 模板规则验证
  90. func (s *contractService) ValidRuleTemplate(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  91. treeSectionVaild := &viewmodels.TreeSectionContract{}
  92. err := ctx.ReadJSON(treeSectionVaild)
  93. if err != nil {
  94. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  95. return treeSectionVaild, err
  96. }
  97. err = treeSectionVaild.ValidateTemplate()
  98. if err != nil {
  99. log.Println("参数验证错误, error=", err)
  100. return treeSectionVaild, err
  101. }
  102. return treeSectionVaild, nil
  103. }
  104. // 模板规则新增项目节
  105. func (s *contractService) ValidRuleSectionAdd(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  106. treeSectionVaild := &viewmodels.TreeSectionContract{}
  107. err := ctx.ReadJSON(treeSectionVaild)
  108. if err != nil {
  109. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  110. return treeSectionVaild, err
  111. }
  112. err = treeSectionVaild.ValidateSectionAdd()
  113. if err != nil {
  114. log.Println("参数验证错误, error=", err)
  115. return treeSectionVaild, err
  116. }
  117. return treeSectionVaild, nil
  118. }
  119. // 模板规则新增项目节
  120. func (s *contractService) ValidRuleSectionDelete(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  121. treeSectionVaild := &viewmodels.TreeSectionContract{}
  122. err := ctx.ReadForm(treeSectionVaild)
  123. if err != nil {
  124. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  125. return treeSectionVaild, err
  126. }
  127. err = treeSectionVaild.ValidateSectionDelete()
  128. if err != nil {
  129. log.Println("参数验证错误, error=", err)
  130. return treeSectionVaild, err
  131. }
  132. return treeSectionVaild, nil
  133. }
  134. func (s *contractService) ValidRuleGet(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  135. treeSectionVaild := &viewmodels.TreeSectionContract{}
  136. err := ctx.ReadForm(treeSectionVaild)
  137. if err != nil {
  138. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  139. return treeSectionVaild, err
  140. }
  141. err = treeSectionVaild.ValidateSectionDelete()
  142. if err != nil {
  143. log.Println("参数验证错误, error=", err)
  144. return treeSectionVaild, err
  145. }
  146. return treeSectionVaild, nil
  147. }
  148. // 验证序号相关
  149. func (s *contractService) ValidRuleSerial(ctx iris.Context) (*viewmodels.TreeSectionContract, error) {
  150. treeSectionVaild := &viewmodels.TreeSectionContract{}
  151. err := ctx.ReadJSON(treeSectionVaild)
  152. if err != nil {
  153. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  154. return treeSectionVaild, err
  155. }
  156. err = treeSectionVaild.ValidateSectionSerial()
  157. if err != nil {
  158. log.Println("参数验证错误, error=", err)
  159. return treeSectionVaild, err
  160. }
  161. return treeSectionVaild, nil
  162. }
  163. // 新增合同参数验证
  164. func (s *contractService) ValidRuleContractAdd(ctx iris.Context) (*viewmodels.Contracts, error) {
  165. // 创建一个存放前端传过来参数
  166. contractsVaild := &viewmodels.Contracts{}
  167. // 存放raw的值,放入到contractsVaild
  168. err := ctx.ReadJSON(contractsVaild)
  169. if err != nil {
  170. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  171. return contractsVaild, err
  172. }
  173. // 验证合同传参
  174. err = contractsVaild.ValidateAdd()
  175. if err != nil {
  176. log.Println("参数验证错误, error=", err)
  177. return contractsVaild, err
  178. }
  179. // xss
  180. contractsVaild.Code = html.EscapeString(contractsVaild.Code)
  181. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  182. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  183. return contractsVaild, nil
  184. }
  185. // 校验编辑接口
  186. func (s *contractService) ValidRuleContractEdi(ctx iris.Context) (*viewmodels.Contracts, error) {
  187. // 创建一个存放前端传过来参数
  188. contractsVaild := &viewmodels.Contracts{}
  189. // 存放raw的值,放入到contractsVaild
  190. err := ctx.ReadJSON(contractsVaild)
  191. if err != nil {
  192. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  193. return contractsVaild, err
  194. }
  195. // 验证合同传参
  196. err = contractsVaild.ValidateEdi()
  197. if err != nil {
  198. log.Println("参数验证错误, error=", err)
  199. return contractsVaild, err
  200. }
  201. contractsVaild.Content = html.EscapeString(contractsVaild.Content)
  202. contractsVaild.Name = html.EscapeString(contractsVaild.Name)
  203. contractsVaild.Price = html.EscapeString(contractsVaild.Price)
  204. contractsVaild.PartyA = html.EscapeString(contractsVaild.PartyA)
  205. contractsVaild.PartyASigner = html.EscapeString(contractsVaild.PartyASigner)
  206. contractsVaild.PartyB = html.EscapeString(contractsVaild.PartyB)
  207. contractsVaild.PartyBSigner = html.EscapeString(contractsVaild.PartyBSigner)
  208. return contractsVaild, nil
  209. }
  210. // 校验删除合同参数
  211. func (s *contractService) ValidRuleContractDel(ctx iris.Context) (*viewmodels.Contracts, error) {
  212. // 创建一个存放前端传过来参数
  213. contractsVaild := &viewmodels.Contracts{}
  214. // 存放raw的值,放入到contractsVaild
  215. err := ctx.ReadJSON(contractsVaild)
  216. if err != nil {
  217. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  218. return contractsVaild, err
  219. }
  220. // 验证合同传参
  221. err = contractsVaild.ValidateDel()
  222. if err != nil {
  223. log.Println("参数验证错误, error=", err)
  224. return contractsVaild, err
  225. }
  226. return contractsVaild, nil
  227. }
  228. // 获得项目节
  229. func (s *contractService) Get(treeId int, bidsectionId int, projectId int) *viewmodels.TreeSectionContract {
  230. // 1.获得项目节
  231. section := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  232. // 2.构造数据
  233. sectionVM := s.makeSectionView(section)
  234. // 3.更新 上移和下一的限制
  235. youngerBrotherList := s.treeContractDao.GetYoungerBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId)
  236. if len(youngerBrotherList) == 0 {
  237. sectionVM.IsEnd = true
  238. }
  239. sectionVM.ElderBrother = true
  240. elderBrotherList := s.treeContractDao.GetElderBrother(section.Serial, section.Depth, section.ParentId, bidsectionId, projectId)
  241. if len(elderBrotherList) == 0 {
  242. sectionVM.ElderBrother = false
  243. }
  244. return sectionVM
  245. }
  246. // 获得合同详情
  247. func (s *contractService) GetContract(contractId int) *viewmodels.Contracts {
  248. contract := s.contractDao.Get(contractId)
  249. contractsVM := &viewmodels.Contracts{}
  250. id, _ := comm.AesEncrypt(strconv.Itoa(contract.Id), conf.SignSecret)
  251. treeId, _ := comm.AesEncrypt(strconv.Itoa(contract.TreeId), conf.SignSecret)
  252. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(contract.BidsectionId), conf.SignSecret)
  253. contractsVM.Id = id
  254. contractsVM.TreeId = treeId
  255. contractsVM.ContractsType = contract.ContractsType
  256. contractsVM.BidsectionId = bidsectionId
  257. contractsVM.Name = contract.Name
  258. contractsVM.Content = contract.Content
  259. contractsVM.Code = contract.Code
  260. contractsVM.PartyA = contract.PartyA
  261. contractsVM.PartyASigner = contract.PartyASigner
  262. contractsVM.PartyB = contract.PartyB
  263. contractsVM.PartyBSigner = contract.PartyBSigner
  264. contractsVM.Remarks = contract.Remarks
  265. contractsVM.Price = contract.Price
  266. contractsVM.Returned = contract.Returned
  267. contractsVM.Paid = contract.Paid
  268. contractsVM.Status = contract.Status
  269. contractsVM.CreateTime = contract.CreateTime.Format(conf.SysTimeform)
  270. contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
  271. contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
  272. return contractsVM
  273. }
  274. // 新增合同
  275. func (s *contractService) Add(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  276. // 1. 项目节存在
  277. contracts := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  278. if contracts.Id == 0 {
  279. return errors.New("未找到项目节")
  280. }
  281. // k := int32(projectId)
  282. // 2.项目节是没有合同
  283. if contracts.ContractId != 0 {
  284. return errors.New("该项目节上已经存在合同")
  285. }
  286. // 3.新增合同 --合计标段上的金额
  287. contractsCm := &models.CmContracts{}
  288. contractsCm.Code = contractData.Code
  289. contractsCm.Name = contractData.Name
  290. contractsCm.ContractsType = contractData.ContractsType
  291. contractsCm.Price = contractData.Price
  292. contractsCm.Returned = "0"
  293. contractsCm.Paid = "0"
  294. contractsCm.TreeId = treeId
  295. contractsCm.ProjectId = projectId
  296. contractsCm.BidsectionId = bidsectionId
  297. contractsCm.Status = 0
  298. contractsCm.CreateTime = time.Now()
  299. contractsCm.UpdateTime = time.Now()
  300. err := s.contractDao.Add(contractsCm)
  301. if err != nil {
  302. return err
  303. }
  304. // 3.获得该标段下合同总数 - 总收入金额
  305. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  306. // 更新标段目录上合同金额和总数
  307. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  308. if err != nil {
  309. return err
  310. }
  311. return nil
  312. }
  313. // 更新合同
  314. func (s *contractService) Update(contractData *viewmodels.Contracts, projectId int, bidsectionId int, treeId int) error {
  315. // 1. 项目节存在
  316. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  317. if contractsTree.Id == 0 {
  318. return errors.New("未找到项目节")
  319. }
  320. // 2.项目节是没有合同
  321. if contractsTree.ContractId == 0 {
  322. return errors.New("该项目节上没有找到合同")
  323. }
  324. contractsCm := &models.CmContracts{}
  325. contractsCm.Id = contractsTree.ContractId
  326. contractsCm.Content = contractData.Content
  327. contractsCm.Name = contractData.Name
  328. contractsCm.Price = contractData.Price
  329. contractsCm.PartyA = contractData.PartyA
  330. contractsCm.PartyASigner = contractData.PartyASigner
  331. contractsCm.PartyB = contractData.PartyB
  332. contractsCm.PartyBSigner = contractData.PartyBSigner
  333. loc, _ := time.LoadLocation("Local")
  334. SignerTime, err := time.ParseInLocation(conf.SysTimeform, contractData.SignerTime, loc)
  335. if err != nil {
  336. return errors.New("签约时间填写异常")
  337. }
  338. contractsCm.SignerTime = SignerTime
  339. contractsCm.Remarks = contractData.Remarks
  340. columns := []string{"Content", "Name", "Price", "PartyA", "PartyASigner", "PartyB", "PartyBSigner"}
  341. err = s.contractDao.Update(contractsCm, columns, projectId, bidsectionId, treeId)
  342. if err != nil {
  343. return err
  344. }
  345. // 3.获得该标段下合同总数 - 总收入金额
  346. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  347. // 更新标段目录上合同金额和总数
  348. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  349. if err != nil {
  350. return err
  351. }
  352. return nil
  353. }
  354. // 删除合同
  355. func (s *contractService) Delete(projectId int, bidsectionId int, treeId int, id int) error {
  356. // 1. 项目节存在
  357. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  358. if contractsTree.Id == 0 {
  359. return errors.New("未找到项目节")
  360. }
  361. // 2.项目节是没有合同
  362. if contractsTree.ContractId == 0 {
  363. return errors.New("该项目节上没有找到合同")
  364. }
  365. // 删除合同
  366. err := s.contractDao.Delete(projectId, bidsectionId, treeId, id)
  367. if err != nil {
  368. return err
  369. }
  370. // 3.获得该标段下合同总数 - 总收入金额
  371. contractTotal, priceTotal := s.getContractTotalAndPrice(bidsectionId, projectId)
  372. // 更新标段目录上合同金额和总数
  373. err = s.treeDao.UpdateContractsAndIncomePrice(projectId, bidsectionId, contractTotal, priceTotal)
  374. if err != nil {
  375. return err
  376. }
  377. // 4.更新回款总金额
  378. err = s.contractReturnDao.UpdateTotalPrice(projectId, bidsectionId, id)
  379. if err != nil {
  380. return err
  381. }
  382. return nil
  383. }
  384. // 关闭合同
  385. func (s *contractService) Close(projectId int, bidsectionId int, treeId int, id int) error {
  386. // 1. 项目节存在
  387. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  388. if contractsTree.Id == 0 {
  389. return errors.New("未找到项目节")
  390. }
  391. // 2.项目节是没有合同
  392. if contractsTree.ContractId == 0 {
  393. return errors.New("该项目节上没有找到合同")
  394. }
  395. // 关闭合同
  396. err := s.contractDao.Close(projectId, bidsectionId, treeId, id)
  397. if err != nil {
  398. return err
  399. }
  400. return nil
  401. }
  402. // 解锁合同
  403. func (s *contractService) Unlock(projectId int, bidsectionId int, treeId int, id int) error {
  404. // 1. 项目节存在
  405. contractsTree := s.treeContractDao.Get(treeId, bidsectionId, projectId)
  406. if contractsTree.Id == 0 {
  407. return errors.New("未找到项目节")
  408. }
  409. // 2.项目节是没有合同
  410. if contractsTree.ContractId == 0 {
  411. return errors.New("该项目节上没有找到合同")
  412. }
  413. // 解锁合同
  414. err := s.contractDao.Unlock(projectId, bidsectionId, treeId, id)
  415. if err != nil {
  416. return err
  417. }
  418. return nil
  419. }
  420. // 获得合同总数量和总金额
  421. func (s *contractService) getContractTotalAndPrice(bidsectionId int, projectId int) (contractTotal int, priceTotal float64) {
  422. contractList := s.treeContractDao.GetContract(bidsectionId, projectId)
  423. priceTotal = 0.00
  424. for _, item := range contractList {
  425. contractPrice, _ := strconv.ParseFloat(item.ContractPrice, 64)
  426. priceTotal = priceTotal + contractPrice
  427. }
  428. // 合同总数
  429. // contractTotal = len(contractList) + 1
  430. contractTotal = len(contractList)
  431. // 合同收入总金额
  432. // price, _ := strconv.ParseFloat(priceString, 64)
  433. // priceTotal = priceTotal + price
  434. // 保留2位小数
  435. priceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", priceTotal), 64)
  436. return contractTotal, priceTotal
  437. }