contract_paid_service.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*
  2. * @description: 合同已支付 相关业务操作
  3. * @Author: CP
  4. * @Date: 2020-12-22 14:33:43
  5. * @FilePath: \construction_management\services\contract_paid_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "fmt"
  11. "log"
  12. "strconv"
  13. "time"
  14. "github.com/kataras/iris/v12"
  15. "github.com/shopspring/decimal"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/models"
  19. "go.mod/web/viewmodels"
  20. )
  21. // 获得合同下已支付列表
  22. func (s *contractService) PaidAll(projectId int, bidsectionId int, contractsId int, page int) []*viewmodels.ContractsPaid {
  23. // 1.获得合同回款列表
  24. // data := s.contractReturnDao.GetPage(projectId, bidsectionId, contractsId, page)
  25. data := s.contractPaidDao.GetAll(projectId, bidsectionId, contractsId)
  26. contractsReturnVM := make([]*viewmodels.ContractsPaid, 0)
  27. for _, item := range data {
  28. cr := s.makeContractPaidVM(&item)
  29. contractsReturnVM = append(contractsReturnVM, cr)
  30. }
  31. return contractsReturnVM
  32. }
  33. // 创建已支付信息
  34. func (s *contractService) PaidCreate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, projectAccountId int) error {
  35. // 1.合同存在
  36. contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
  37. if contract.Id == 0 {
  38. return errors.New("未找到合同")
  39. }
  40. // 1-2 合同关闭 不能操作
  41. if contract.Status == 2 {
  42. return errors.New("合同已关闭")
  43. }
  44. // 1-3已支付的中金额不能超过 合同金额
  45. price := decimal.NewFromFloat(returnData.Price)
  46. // price, err := decimal.NewFromString(returnData.Price)
  47. // if err != nil {
  48. // return errors.New("金额填写有误")
  49. // }
  50. contractDeductionPrice := decimal.NewFromFloat(returnData.ContractDeduction)
  51. contractPrice, _ := decimal.NewFromString(contract.Price)
  52. paidPrice, _ := decimal.NewFromString(contract.Paid)
  53. resultPrice := contractPrice.Sub(paidPrice)
  54. resultPrice = resultPrice.Add(contractDeductionPrice)
  55. // 合同额-已支付金额+已扣款金额
  56. if price.GreaterThan(resultPrice) {
  57. return errors.New("支付金额不能超过合同金额")
  58. }
  59. // 2.已支付信息
  60. contractsReturnCm := &models.CmContractsPaid{}
  61. contractsReturnCm.ContractsId = contractsId
  62. contractsReturnCm.ProjectId = projectId
  63. contractsReturnCm.BidsectionId = bidsectionId
  64. contractsReturnCm.Way = returnData.Way
  65. contractsReturnCm.Remarks = returnData.Remarks
  66. contractsReturnCm.CreateTime = time.Now()
  67. contractsReturnCm.UpdateTime = time.Now()
  68. loc, _ := time.LoadLocation("Local")
  69. time, err := time.ParseInLocation(conf.SysTimeform, returnData.Time, loc)
  70. if err != nil {
  71. return errors.New("签约时间填写异常")
  72. }
  73. contractsReturnCm.Time = time
  74. contractsReturnCm.CreateUser = returnData.CreateUser
  75. contractsReturnCm.AccountId = projectAccountId
  76. contractsReturnCm.Price = fmt.Sprintf("%.2f", returnData.Price)
  77. contractsReturnCm.ContractDeduction = fmt.Sprintf("%.2f", returnData.ContractDeduction)
  78. // 3.新增回款
  79. err = s.contractPaidDao.Add(contractsReturnCm)
  80. if err != nil {
  81. return err
  82. }
  83. // 4. 更新已支付总金额 -项目节树 标段树 合同表
  84. err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
  85. if err != nil {
  86. return err
  87. }
  88. return nil
  89. }
  90. // 编辑已支付信息
  91. func (s *contractService) PaidUpdate(returnData *viewmodels.ContractsPaid, projectId int, bidsectionId int, contractsId int, id int) error {
  92. // 1.合同存在
  93. contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
  94. if contract.Id == 0 {
  95. return errors.New("未找到合同")
  96. }
  97. // 1-1 已支付是否存在
  98. contractPaid := s.contractPaidDao.Get(id, contractsId, bidsectionId)
  99. if contractPaid.Id == 0 {
  100. return errors.New("未找到已支付")
  101. }
  102. // 1-2 合同关闭 不能操作
  103. if contract.Status == 2 {
  104. return errors.New("合同已关闭")
  105. }
  106. // 1-3已支付的中金额不能超过 合同金额
  107. price := decimal.NewFromFloat(returnData.Price)
  108. // price, err := decimal.NewFromString(returnData.Price)
  109. // if err != nil {
  110. // return errors.New("金额填写有误")
  111. // }
  112. contractPrice, _ := decimal.NewFromString(contract.Price)
  113. paidPrice, _ := decimal.NewFromString(contract.Paid)
  114. // 当前回款金额
  115. returnedPresentPrice, _ := decimal.NewFromString(contractPaid.Price)
  116. // 合同金额-(回款总金额-当前回款金额)
  117. // 回款总金额-当前回款金额
  118. subPrice := paidPrice.Sub(returnedPresentPrice)
  119. // 合同金额-subPrice
  120. resultPrice := contractPrice.Sub(subPrice)
  121. if price.GreaterThan(resultPrice) {
  122. return errors.New("支付金额不能超过合同金额")
  123. }
  124. // 2.已支付信息
  125. contractsReturnCm := &models.CmContractsPaid{}
  126. contractsReturnCm.Id = id
  127. contractsReturnCm.Way = returnData.Way
  128. contractsReturnCm.Remarks = returnData.Remarks
  129. loc, _ := time.LoadLocation("Local")
  130. time, err := time.ParseInLocation("2006-01-02", returnData.Time, loc)
  131. if err != nil {
  132. return errors.New("已支付时间填写异常")
  133. }
  134. contractsReturnCm.Time = time
  135. // _, err = strconv.ParseFloat(returnData.Price, 64)
  136. // if err != nil {
  137. // return errors.New("金额填写有误")
  138. // }
  139. contractsReturnCm.Price = fmt.Sprintf("%.2f", returnData.Price)
  140. contractsReturnCm.ContractDeduction = fmt.Sprintf("%.2f", returnData.ContractDeduction)
  141. // 3.更新已支付信息
  142. err = s.contractPaidDao.Update(contractsReturnCm, contractsId, bidsectionId)
  143. if err != nil {
  144. return err
  145. }
  146. // 4. 更新已支付总金额 -项目节树 标段树 合同表
  147. err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
  148. if err != nil {
  149. return err
  150. }
  151. return nil
  152. }
  153. // 删除已支付
  154. func (s *contractService) PaidDelete(projectId int, bidsectionId int, contractsId int, id int) error {
  155. // 1.合同存在
  156. contract := s.contractDao.GetInProjectAndBidsection(contractsId, projectId, bidsectionId)
  157. if contract.Id == 0 {
  158. return errors.New("未找到合同")
  159. }
  160. // 1-1 已支付是否存在
  161. contractPaid := s.contractPaidDao.Get(id, contractsId, bidsectionId)
  162. if contractPaid.Id == 0 {
  163. return errors.New("未找到已支付")
  164. }
  165. // 1-2 合同关闭 不能操作
  166. if contract.Status == 2 {
  167. return errors.New("合同已关闭")
  168. }
  169. // 3.合同锁定 不能删除
  170. if contract.Locking == 1 {
  171. return errors.New("该合同已锁定")
  172. }
  173. // 1-2. 删除已支付
  174. err := s.contractPaidDao.Delete(id, contractsId, bidsectionId, projectId)
  175. if err != nil {
  176. return err
  177. }
  178. // 2. 更新回款总金额 -项目节树 标段树 合同表
  179. err = s.contractPaidDao.UpdatePaidTotalPrice(projectId, bidsectionId, contractsId)
  180. if err != nil {
  181. return err
  182. }
  183. return nil
  184. }
  185. func (s *contractService) makeContractPaidVM(data *models.CmContractsPaid) *viewmodels.ContractsPaid {
  186. viewContractsReturn := &viewmodels.ContractsPaid{}
  187. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  188. contractsId, _ := comm.AesEncrypt(strconv.Itoa(data.ContractsId), conf.SignSecret)
  189. projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  190. bidsectionId, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
  191. viewContractsReturn.Id = id
  192. viewContractsReturn.ContractsId = contractsId
  193. viewContractsReturn.ProjectId = projectId
  194. viewContractsReturn.BidsectionId = bidsectionId
  195. viewContractsReturn.Time = data.Time.Format(conf.SysTimeform)
  196. contractDeduction, _ := strconv.ParseFloat(data.ContractDeduction, 64)
  197. viewContractsReturn.ContractDeduction = contractDeduction
  198. price, _ := strconv.ParseFloat(data.Price, 64)
  199. // fmt.Sprintf("%.2f", price)
  200. viewContractsReturn.Price = price
  201. viewContractsReturn.Way = data.Way
  202. viewContractsReturn.CreateUser = data.CreateUser
  203. viewContractsReturn.Remarks = data.Remarks
  204. viewContractsReturn.CreateTime = data.CreateTime.Format(conf.SysTimeform)
  205. counts, _ := s.annexDao.GetCount(5, data.Id)
  206. viewContractsReturn.FileCounts = counts
  207. return viewContractsReturn
  208. }
  209. // 校验回款参数
  210. func (s *contractService) ValidRuleContractPaidAdd(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
  211. // 创建一个存放前端传过来参数
  212. contractsVaild := &viewmodels.ContractsPaid{}
  213. // 存放raw的值,放入到contractsVaild
  214. err := ctx.ReadJSON(contractsVaild)
  215. if err != nil {
  216. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  217. return contractsVaild, err
  218. }
  219. // 验证合同传参
  220. err = contractsVaild.ValidateAdd()
  221. if err != nil {
  222. log.Println("参数验证错误, error=", err)
  223. return contractsVaild, err
  224. }
  225. return contractsVaild, nil
  226. }
  227. func (s *contractService) ValidRuleContractPaid(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
  228. // 创建一个存放前端传过来参数
  229. contractsVaild := &viewmodels.ContractsPaid{}
  230. // 存放raw的值,放入到contractsVaild
  231. err := ctx.ReadForm(contractsVaild)
  232. if err != nil {
  233. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  234. return contractsVaild, err
  235. }
  236. // 验证合同传参
  237. err = contractsVaild.Validate()
  238. if err != nil {
  239. log.Println("参数验证错误, error=", err)
  240. return contractsVaild, err
  241. }
  242. return contractsVaild, nil
  243. }
  244. func (s *contractService) ValidRuleContractPaidDel(ctx iris.Context) (*viewmodels.ContractsPaid, error) {
  245. // 创建一个存放前端传过来参数
  246. contractsVaild := &viewmodels.ContractsPaid{}
  247. // 存放raw的值,放入到contractsVaild
  248. err := ctx.ReadForm(contractsVaild)
  249. if err != nil {
  250. log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
  251. return contractsVaild, err
  252. }
  253. // 验证合同传参
  254. err = contractsVaild.ValidateDel()
  255. if err != nil {
  256. log.Println("参数验证错误, error=", err)
  257. return contractsVaild, err
  258. }
  259. return contractsVaild, nil
  260. }