contract_service.go 17 KB

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