index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. <template>
  2. <!-- 新增合同 -->
  3. <a-modal class="commonModal add-spot-contract" :title="formState.ContractType === 1 ? '新增现货合同' : '新增销售合同'" v-model:visible="visible" centered :maskClosable="false" @cancel="closeAction" width="890px">
  4. <template #footer>
  5. <a-button key="submit" class="cancelBtn" :loading="loading" :disabled="loading" @click="submit(1)">保存草稿</a-button>
  6. <a-button key="submit" type="primary" :loading="loading" :disabled="loading" @click="submit(2)">提交审核</a-button>
  7. </template>
  8. <a-form class="inlineForm" ref="formRef" :model="formState" :rules="rules">
  9. <fieldset class="formFieldSet">
  10. <legend>基本信息</legend>
  11. <a-row :gutter="24">
  12. <a-col :span="12">
  13. <a-form-item label="合同编号" name="ContractNo">
  14. <a-input class="dialogInput" style="width: 200px" v-model:value="formState.ContractNo" placeholder="请输入合同编号" />
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="12">
  18. <!-- <a-form-item label="合同类型" name="ContractType">
  19. <a-select class="inlineFormSelect" style="width: 200px" @change="contractChange" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.ContractType" placeholder="请选择合同类型">
  20. <a-select-option v-for="item in contractType" :key="item.key" :value="item.key">
  21. {{ item.value }}
  22. </a-select-option>
  23. </a-select>
  24. </a-form-item> -->
  25. <a-form-item label="合同类型">
  26. <span class="white">{{ getContractTypeName(formState.ContractType) }}</span>
  27. </a-form-item>
  28. </a-col>
  29. <a-col :span="12">
  30. <a-form-item label="业务类型" name="BizType">
  31. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BizType" placeholder="请选择业务类型">
  32. <a-select-option v-for="item in businessType" :key="item.key" :value="item.key">
  33. {{ item.value }}
  34. </a-select-option>
  35. </a-select>
  36. </a-form-item>
  37. </a-col>
  38. <template v-if="isSell">
  39. <a-col :span="12">
  40. <a-form-item label="采购方" name="BuyUserID">
  41. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.BuyUserID" placeholder="请选择客户">
  42. <!-- 客户资料列表 正常 -->
  43. <a-select-option :value="item.userid" v-for="item in customList" :key="item.userid">
  44. {{ item.nickname }}
  45. </a-select-option>
  46. </a-select>
  47. </a-form-item>
  48. </a-col>
  49. <a-col :span="12">
  50. <a-form-item label="销售方">
  51. <span class="white">{{ getRootUserInfo().accountname }}</span>
  52. </a-form-item>
  53. </a-col>
  54. </template>
  55. <template v-else>
  56. <a-col :span="12">
  57. <a-form-item label="采购方">
  58. <span class="white">{{ getRootUserInfo().accountname }}</span>
  59. </a-form-item>
  60. </a-col>
  61. <a-col :span="12">
  62. <a-form-item label="销售方" name="SellUserID">
  63. <a-select class="inlineFormSelect" v-model:value="formState.SellUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择客户">
  64. <!-- 客户资料列表 正常 -->
  65. <a-select-option :value="item.userid" v-for="item in customList" :key="item.userid">
  66. {{ item.nickname }}
  67. </a-select-option>
  68. </a-select>
  69. </a-form-item>
  70. </a-col>
  71. </template>
  72. <a-col :span="12">
  73. <a-form-item label="合同附件" class="checkboxGroupItem" name="ContractAttachment">
  74. <UploadImg :visible="visible" @upload="uploadImgAction" />
  75. </a-form-item>
  76. </a-col>
  77. <a-col :span="12">
  78. <a-form-item label="交易主体" name="SubjectID">
  79. <a-select class="inlineFormSelect" style="width: 200px" v-model:value="formState.SubjectID" placeholder="请选择主体">
  80. <a-select-option :value="item.subjectid" v-for="item in subjectList" :key="item.subjectid">
  81. {{ item.subjectname }}
  82. </a-select-option>
  83. </a-select>
  84. </a-form-item>
  85. </a-col>
  86. </a-row>
  87. </fieldset>
  88. <fieldset class="formFieldSet">
  89. <legend>现货信息</legend>
  90. <a-row :gutter="24">
  91. <a-col :span="12">
  92. <a-form-item label="现货品种" name="DeliveryGoodsID">
  93. <a-select class="inlineFormSelect" style="width: 200px" @change="deliveryGoodsChange" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.DeliveryGoodsID" placeholder="请选择现货品种">
  94. <a-select-option v-for="item in deliveryGoodsList" :key="item.deliverygoodsid" :value="item.deliverygoodsid">
  95. {{ item.deliverygoodsname }}
  96. </a-select-option>
  97. </a-select>
  98. </a-form-item>
  99. </a-col>
  100. <a-col :span="12">
  101. <a-form-item label="商品" name="WrStandardID">
  102. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" @change="wrStandardChange" v-model:value="formState.WrStandardID" placeholder="请选择商品">
  103. <a-select-option v-for="item in wrstandardList" :key="item.wrstandardid" :value="item.wrstandardid">
  104. {{ item.wrstandardname }}
  105. </a-select-option>
  106. </a-select>
  107. </a-form-item>
  108. </a-col>
  109. <a-col :span="12">
  110. <a-form-item label="品牌" name="SpotGoodsBrandID">
  111. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.SpotGoodsBrandID" placeholder="请选择品牌">
  112. <a-select-option v-for="item in barandList" :key="item.brandid" :value="item.brandid">
  113. {{ item.brandname }}
  114. </a-select-option>
  115. </a-select>
  116. </a-form-item>
  117. </a-col>
  118. <a-col :span="12">
  119. <a-form-item label="商品规格" name="SpotGoodsDesc">
  120. <a-input class="dialogInput" style="width: 200px" v-model:value="formState.SpotGoodsDesc" placeholder="请输入商品规格" />
  121. </a-form-item>
  122. </a-col>
  123. </a-row>
  124. </fieldset>
  125. <fieldset class="formFieldSet">
  126. <legend>价格信息</legend>
  127. <a-row :gutter="24">
  128. <a-col :span="12">
  129. <a-form-item label="结算币种" name="CurrencyID">
  130. <a-select class="inlineFormSelect" v-model:value="formState.CurrencyID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择结算币种">
  131. <a-select-option v-for="item in payCurrency" :key="item.enumitemname" :value="item.enumitemname">
  132. {{ item.enumdicname }}
  133. </a-select-option>
  134. </a-select>
  135. </a-form-item>
  136. </a-col>
  137. <a-col :span="12">
  138. <a-form-item label="数量" name="Qty">
  139. <a-input class="dialogInput suffixGrey" v-model:value="formState.Qty" style="width: 200px" @change="getAmout" placeholder="请输入数量" :suffix="numberUnit" />
  140. </a-form-item>
  141. </a-col>
  142. <a-col :span="12">
  143. <a-form-item label="交收期">
  144. <a-range-picker v-model:value="deliveryDate" class="commonPicker" style="width: 200px" :disabled-date="disabledDate" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
  145. </a-form-item>
  146. </a-col>
  147. <a-col :span="12">
  148. <a-form-item label="定价类型" name="PriceType">
  149. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.PriceType" placeholder="请选择定价类型">
  150. <a-select-option v-for="item in priceType" :key="item.key" :value="item.key">
  151. {{ item.value }}
  152. </a-select-option>
  153. </a-select>
  154. </a-form-item>
  155. </a-col>
  156. <!-- 以下是点价的价格信息 start -->
  157. <template v-if="formState.PriceType === 2 || formState.PriceType === 3">
  158. <a-col :span="12">
  159. <a-form-item label="点价类型">
  160. <a-select class="inlineFormSelect" v-model:value="pricingType" style="width: 200px" placeholder="请选择点价类型" @change="pricingTypeChange">
  161. <a-select-option :value="0">现货</a-select-option>
  162. <a-select-option :value="1">期货</a-select-option>
  163. </a-select>
  164. </a-form-item>
  165. </a-col>
  166. <a-col :span="12" v-if="pricingType === 1">
  167. <a-form-item label="点价合约" name="GoodsID">
  168. <a-select class="inlineFormSelect" v-model:value="formState.GoodsID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择点价合约">
  169. <a-select-option v-for="item in goodsList" :key="item.goodsid" :value="item.goodsid">
  170. {{ item.goodsname }}
  171. </a-select-option>
  172. </a-select>
  173. </a-form-item>
  174. </a-col>
  175. <a-col :span="12" v-if="formState.PriceType === 3">
  176. <a-form-item label="暂定价">
  177. <a-input class="dialogInput suffixGrey" style="width: 200px" :suffix="payCurrencyUnit" placeholder="请输入暂定价" />
  178. </a-form-item>
  179. </a-col>
  180. <a-col :span="24">
  181. <a-form-item label="点价说明" name="Remark">
  182. <a-input class="dialogInput" style="width: 608px" v-model:value="formState.Remark" placeholder="请输入点价说明" />
  183. </a-form-item>
  184. </a-col>
  185. <a-col :span="12">
  186. <a-form-item label="升贴水" name="PriceMove">
  187. <a-input-number class="dialogInput suffixGrey" v-model:value="formState.PriceMove" placeholder="请输入升贴水" :min="0" :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
  188. </a-form-item>
  189. </a-col>
  190. <a-col :span="12">
  191. <a-form-item label="点价期">
  192. <a-range-picker v-model:value="priceDate" class="commonPicker" :disabled-date="disabledDate" style="width: 200px" :show-time="{ hideDisabledOptions: true }" format="YYYY-MM-DD" />
  193. </a-form-item>
  194. </a-col>
  195. </template>
  196. <!-- 以上是点价的价格信息 end -->
  197. <template v-if="formState.PriceType === 1">
  198. <a-col :span="12">
  199. <a-form-item label="价格" name="Price">
  200. <a-input class="dialogInput suffixGrey" v-model:value="formState.Price" @change="getAmout" placeholder="请输入价格" :suffix="`${payCurrencyUnit}/${numberUnit}`" style="width: 200px" />
  201. </a-form-item>
  202. </a-col>
  203. <a-col :span="12">
  204. <a-form-item label="金额" class="relative" name="Amount">
  205. <a-input class="dialogInput suffixGrey" v-model:value="formState.Amount" readonly placeholder="输入数量和价格后自动算" :suffix="payCurrencyUnit" style="width: 200px" />
  206. </a-form-item>
  207. </a-col>
  208. </template>
  209. </a-row>
  210. </fieldset>
  211. <fieldset class="formFieldSet">
  212. <legend>其他信息</legend>
  213. <a-row :gutter="24">
  214. <a-col :span="12">
  215. <a-form-item label="保证金" name="ContractMargin">
  216. <a-input class="dialogInput suffixGrey" placeholder="请输入保证金" v-model:value="formState.ContractMargin" style="width: 200px" :suffix="payCurrencyUnit" />
  217. </a-form-item>
  218. </a-col>
  219. <a-col :span="12">
  220. <a-form-item label="业务员" name="SaleUserID">
  221. <a-select class="inlineFormSelect" v-model:value="formState.SaleUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择业务员">
  222. <a-select-option v-for="item in businesserList" :key="item.userid" :value="item.userid"> {{ item.accountname }}-{{ item.logincode }} </a-select-option>
  223. </a-select>
  224. </a-form-item>
  225. </a-col>
  226. </a-row>
  227. <a-row :gutter="24">
  228. <a-col :span="12">
  229. <a-form-item label="跟单员" name="MerUserID">
  230. <a-select class="inlineFormSelect" v-model:value="formState.MerUserID" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" placeholder="请选择跟单员">
  231. <a-select-option v-for="item in merchandiserList" :key="item.userid" :value="item.userid"> {{ item.accountname }}-{{ item.logincode }} </a-select-option>
  232. </a-select>
  233. </a-form-item>
  234. </a-col>
  235. <a-col :span="12">
  236. <a-form-item label="交易用户" name="TradeUserID">
  237. <a-select class="inlineFormSelect" style="width: 200px" :getPopupContainer="(triggerNode) => triggerNode.parentNode" v-model:value="formState.TradeUserID" placeholder="请选择交易用户">
  238. <a-select-option v-for="item in traderList" :key="item.roleid" :value="item.roleid">
  239. {{ item.rolename }}
  240. </a-select-option>
  241. </a-select>
  242. </a-form-item>
  243. </a-col>
  244. </a-row>
  245. </fieldset>
  246. </a-form>
  247. </a-modal>
  248. </template>
  249. <script lang="ts">
  250. import { defineComponent, PropType, ref } from 'vue';
  251. import { addContractReq } from './setup';
  252. import { getRootUserInfo, getUserName, getUserId } from '@/services/bus/user';
  253. import { FormState } from '../interface';
  254. import { formatTime } from '@/common/methods/format';
  255. import { Ermcp3ContractRsp } from '@/services/go/ermcp/spot-contract/interface';
  256. import { Moment } from 'moment';
  257. import { handleFormRule, handleContract, handleDeliveryGoods, handleAmout, handlePrice, handleDate, handleFromState } from '../setup';
  258. import { validateAction } from '@/common/setup/form';
  259. import { ErmcpLoginUser } from '@/services/go/ermcp/account/interface';
  260. import { Ermcp3SubjectRsp } from '@/services/go/ermcp/subject/interface';
  261. import { QueryPaAreaSubject } from '@/services/go/ermcp/subject';
  262. import { handlerManagerList } from '@/common/setup/user';
  263. import { getUploadImg } from '@/common/setup/upload';
  264. import UploadImg from '@/common/components/uploadImg/index.vue';
  265. import { _closeModal } from '@/common/setup/modal/modal';
  266. import { getContractTypeName } from '@/common/constants/enumsName';
  267. export default defineComponent({
  268. name: 'add-spot-contract',
  269. components: { UploadImg },
  270. emits: ['cancel', 'update'],
  271. props: {
  272. selectedRow: {
  273. type: Object as PropType<Ermcp3ContractRsp>,
  274. default: {},
  275. },
  276. contractType: {
  277. type: Number,
  278. required: true,
  279. },
  280. },
  281. setup(props, context) {
  282. const { visible, cancel } = _closeModal(context);
  283. const { sendReq } = addContractReq();
  284. const loading = ref<boolean>(false);
  285. const pricingType = ref(1); // 点价类型
  286. // 表单
  287. const formRef = ref();
  288. const { formState, businessType, initFormData } = handleFromState(props.contractType);
  289. const { rules } = handleFormRule(formState);
  290. // 合同类型
  291. const { contractType, isSell, contractChange, customList, queryCustomList } = handleContract(formState);
  292. // 处理现货商品
  293. const { deliveryGoodsList, barandList, wrstandardList, goodsList, numberUnit, wrStandardChange, deliveryGoodsChange } = handleDeliveryGoods(formState);
  294. // 价格信息
  295. const { priceType, payCurrency, payCurrencyUnit, parCurrencyChange } = handlePrice(formState);
  296. // 日期
  297. const { deliveryDate, priceDate, disabledDate } = handleDate();
  298. // 处理金额
  299. const { getAmout } = handleAmout(formState);
  300. // 获取 业务账户
  301. const { queryTable: queryBusinessManager, getBusinesserOrMerchandiser } = handlerManagerList(loading, 1);
  302. const { tableList: traderList, queryTable: queryTradeManager } = handlerManagerList(loading, 2, true);
  303. // 业务员
  304. const businesserList = ref<ErmcpLoginUser[]>([]);
  305. // 跟单员
  306. const merchandiserList = ref<ErmcpLoginUser[]>([]);
  307. const { getFirstImg, uploadImgAction } = getUploadImg();
  308. // 交易主体列表
  309. const subjectList = ref<Ermcp3SubjectRsp[]>([]);
  310. QueryPaAreaSubject().then((res) => {
  311. subjectList.value = res.filter((item) => item.subjectstatus === 1);
  312. });
  313. queryCustomList();
  314. queryTradeManager();
  315. queryBusinessManager().then(() => {
  316. businesserList.value = getBusinesserOrMerchandiser('22');
  317. merchandiserList.value = getBusinesserOrMerchandiser('23');
  318. });
  319. function submit(OperateType: 1 | 2) {
  320. console.log(formState)
  321. validateAction<FormState>(formRef, formState).then((param) => {
  322. const id = getUserId();
  323. isSell.value ? (param.SellUserID = id) : (param.BuyUserID = id);
  324. const fn = (value: Moment) => {
  325. return formatTime(value, 'd') + ' ' + '00:00:00';
  326. };
  327. // 交收期
  328. const dDate = deliveryDate.value;
  329. if (dDate.length) {
  330. const DeliveryStartDate = fn(dDate[0]);
  331. const DeliveryEndDate = fn(dDate[1]);
  332. Object.assign(param, { DeliveryStartDate, DeliveryEndDate });
  333. }
  334. // 点价期
  335. const pDate = priceDate.value;
  336. if (pDate.length && param.PriceType !== 1) {
  337. // 点价日期[2:点价3:暂定价]
  338. const StartDate = fn(pDate[0]);
  339. const EndDate = fn(pDate[1]);
  340. Object.assign(param, { StartDate, EndDate });
  341. }
  342. // 合同附件
  343. param.ContractAttachment = getFirstImg();
  344. sendReq(param, loading, OperateType)
  345. .then((res) => {
  346. cancel(true);
  347. })
  348. .catch((err) => { });
  349. });
  350. }
  351. function closeAction() {
  352. //清空添加成功后的数据,确保在此新增打开是个空数据
  353. Object.assign(formState, initFormData());
  354. cancel();
  355. }
  356. // 选择点价类型
  357. const pricingTypeChange = (value: number) => {
  358. if (value === 0) {
  359. formState.GoodsID = 0;
  360. } else {
  361. formState.GoodsID = undefined;
  362. }
  363. }
  364. return {
  365. visible,
  366. closeAction,
  367. submit,
  368. formRef,
  369. loading,
  370. pricingType,
  371. maskClosableFlag: false,
  372. formState,
  373. rules,
  374. businessType,
  375. contractType,
  376. isSell,
  377. contractChange,
  378. pricingTypeChange,
  379. customList,
  380. deliveryGoodsList,
  381. barandList,
  382. wrstandardList,
  383. goodsList,
  384. deliveryGoodsChange,
  385. wrStandardChange,
  386. priceType,
  387. payCurrency,
  388. payCurrencyUnit,
  389. parCurrencyChange,
  390. numberUnit,
  391. getUserName,
  392. deliveryDate,
  393. priceDate,
  394. disabledDate,
  395. getAmout,
  396. traderList,
  397. businesserList,
  398. merchandiserList,
  399. uploadImgAction,
  400. getRootUserInfo,
  401. subjectList,
  402. getContractTypeName,
  403. };
  404. },
  405. });
  406. </script>
  407. <style lang="less">
  408. .add-spot-contract {
  409. .ant-upload-list-item-name {
  410. padding: 0 20px;
  411. }
  412. }
  413. </style>;