artificial_order.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  4. <el-card class="box-card">
  5. <div slot="header" class="header clearfix">
  6. <span>基本信息</span>
  7. </div>
  8. <el-form-item label="订单编号">
  9. <div class="order-number">
  10. <span>{{form.orderNo ? form.orderNo : '未生成'}}</span>
  11. <!-- <span>{{form.orderNo ? `订单编号:${form.orderNo}` : '未生成订单'}}</span>
  12. <span class="order-status" v-if="form.status === '0'">订单创建</span>
  13. <span class="order-status" v-else-if="form.status === '100'">待审核</span>
  14. <span class="order-status" v-else-if="form.status === '101'">审核中</span>
  15. <span class="order-status" v-else-if="form.status === '102'">订单审核成功</span>
  16. <span class="order-status" v-else-if="form.status === '200'">订单开始处理</span>
  17. <span class="order-status" v-else-if="form.status === '201'">订单处理中</span>
  18. <span class="order-status" v-else-if="form.status === '202'">订单已处理</span>
  19. <span class="order-status" v-else-if="form.status === '300'">订单成功</span>
  20. <span class="order-status" v-else-if="form.status === '301'">订单部分退款</span>
  21. <span class="order-status" v-else-if="form.status === '302'">订单已失败</span>
  22. <span class="order-status" v-else-if="form.status === '303'">订单全额退款</span>
  23. <span class="order-status" v-else-if="form.status === '400'">订单支付中</span>
  24. <span class="order-status" v-else-if="form.status === '401'">订单支付成功</span>
  25. <span class="order-status" v-else-if="form.status === '402'">订单支付失败</span>
  26. <span class="order-status" v-else>未生成</span> -->
  27. </div>
  28. </el-form-item>
  29. <el-form-item label="订单用户" prop="uid">
  30. <el-input v-model="form.uid" placeholder="请输入用户uid"></el-input>
  31. </el-form-item>
  32. <el-form-item label="订单名称" prop="productTitle">
  33. <el-input v-model="form.productTitle" placeholder="请输入订单名称,尽量遵循命名规则"></el-input>
  34. </el-form-item>
  35. <el-row :gutter="20">
  36. <el-col :span="12">
  37. <el-form-item label="订单类型" prop="productType">
  38. <el-select v-model="form.productTypeName" placeholder="请选择订单类型" @change="productTypeChange">
  39. <el-option
  40. v-for="item in productTypes"
  41. :key="item.id"
  42. :label="item.name"
  43. :value="item.name"
  44. ></el-option>
  45. </el-select>
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="12">
  49. <el-form-item label="交易类型" prop="orderType">
  50. <el-select v-model="form.orderTypeName" placeholder="请选择交易类型" @change="orderTypeChange">
  51. <el-option
  52. v-for="item in orderTypes"
  53. :key="item.id"
  54. :label="item.name"
  55. :value="item.name"
  56. ></el-option>
  57. </el-select>
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. <el-row :gutter="20">
  62. <el-col :span="12">
  63. <el-form-item label="订单金额" prop="price">
  64. <el-input v-model.number="form.price" placeholder="请输入实际金额"></el-input>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="12">
  68. <el-form-item label="变更余额">
  69. <el-radio v-model="radio" label="1" disabled>收入</el-radio>
  70. <el-radio v-model="radio" label="2" disabled>支出</el-radio>
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. <el-row :gutter="20">
  75. <el-col :span="12">
  76. <el-form-item label="收支类型" prop="channel">
  77. <el-select v-model="form.channelName" placeholder="请选择支付方式" @change="channelChange">
  78. <el-option
  79. v-for="item in channels"
  80. :key="item.id"
  81. :label="item.name"
  82. :value="item.name"
  83. ></el-option>
  84. </el-select>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="12">
  88. <el-form-item label="支付编码">
  89. <el-input v-model="form.outOrderId" placeholder="请输入支付编号,选填"></el-input>
  90. </el-form-item>
  91. </el-col>
  92. </el-row>
  93. </el-card>
  94. <el-card class="box-card">
  95. <div slot="header" class="header clearfix">
  96. <span>其他信息(选填)</span>
  97. </div>
  98. <el-row :gutter="20">
  99. <el-col :span="12">
  100. <el-form-item label="项目ID" prop="productId">
  101. <el-input v-model.number="form.productId" placeholder="请输入项目ID"></el-input>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="12">
  105. <el-form-item label="关联订单" prop="originOrderNo">
  106. <el-input v-model="form.originOrderNo" placeholder="请输入平台订单编号"></el-input>
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. <el-form-item label="外部备注" prop="publicComment">
  111. <el-input v-model="form.publicComment" placeholder="请输入用户可见的备注信息"></el-input>
  112. </el-form-item>
  113. <el-form-item label="内部备注" prop="privateComment">
  114. <quill-editor
  115. ref="quillEditor"
  116. class="editer"
  117. :options="editorOption"
  118. v-model="form.privateComment"
  119. ></quill-editor>
  120. </el-form-item>
  121. </el-card>
  122. <el-form-item>
  123. <el-button class="save-btn" type="primary" @click="saveSubmit()">保存</el-button>
  124. <el-button class="cancel-btn" @click="cancelSubmit()">取消</el-button>
  125. </el-form-item>
  126. <el-form-item>
  127. <el-button v-if="hasSave" class="comfirm-btn" type="primary" @click="confirmSubmit()">确认提交订单</el-button>
  128. <el-button v-else class="comfirm-btn" type="info">确认提交订单</el-button>
  129. </el-form-item>
  130. </el-form>
  131. </div>
  132. </template>
  133. <script>
  134. export default {
  135. data() {
  136. let checkPrice = (rule, value, callback) => {
  137. if (!value) {
  138. return callback(new Error("请输入订单金额"))
  139. } else if (isNaN(value) || value > 100000) {
  140. return callback(new Error("请输入实际金额0-10万元"))
  141. } else {
  142. callback()
  143. }
  144. }
  145. let checkProductId = (rule, value, callback) => {
  146. if (isNaN(value)) {
  147. return callback(new Error("请输入数字"))
  148. } else {
  149. callback()
  150. }
  151. }
  152. let checkOriginOrderNo = (rule, value, callback) => {
  153. const reg = /^[0-9a-zA-Z]+$/
  154. if (!reg.test(value)) {
  155. return callback(new Error("请输入数字和字母"))
  156. } else {
  157. callback()
  158. }
  159. }
  160. return {
  161. action: "",
  162. id: "",
  163. form: {
  164. uid: "",
  165. productTitle: "",
  166. productType: "",
  167. orderType: "",
  168. price: "",
  169. channel: "",
  170. outOrderId: "",
  171. productId: "",
  172. originOrderNo: "",
  173. publicComment: "",
  174. privateComment: "",
  175. orderNo: "",
  176. status: "",
  177. productTypeName: "",
  178. orderTypeName: "",
  179. channelName: ""
  180. },
  181. saveData: {},
  182. rules: {
  183. uid: [{ required: true, message: "请输入用户uid", trigger: "blur" }],
  184. productTitle: [
  185. { required: true, message: "请输入订单名称", trigger: "blur" },
  186. { max: 25, message: "订单名称最多输入25个字", trigger: "blur" },
  187. ],
  188. productType: [{ required: true, message: "请选择订单类型", trigger: "change" }],
  189. orderType: [{ required: true, message: "请选择交易类型", trigger: "change" }],
  190. price: [{ validator: checkPrice, trigger: "blur" }],
  191. originOrderNo: [{ validator: checkOriginOrderNo, trigger: "blur" }],
  192. productId: [{ validator: checkProductId, trigger: "blur" }],
  193. publicComment: [{ max: 50, message: "外部备注最多输入50个字", trigger: "blur" }],
  194. privateComment: [
  195. { required: true, message: "请输入内部备注", trigger: "blur" },
  196. { max: 10000, message: "内部备注最多输入10000个字符", trigger: "blur" },
  197. ]
  198. },
  199. orderTypes: [],
  200. productTypes: [],
  201. channels: [],
  202. orderState: [],
  203. hasSave: false,
  204. radio: "1",
  205. editorOption: {
  206. modules: {
  207. toolbar: [
  208. ["bold", "italic", "underline", "strike"], // toggled buttons
  209. ["blockquote", "code-block"],
  210. [{ header: 1 }, { header: 2 }], // custom button values
  211. [{ list: "ordered" }, { list: "bullet" }],
  212. [{ script: "sub" }, { script: "super" }], // superscript/subscript
  213. [{ indent: "-1" }, { indent: "+1" }], // outdent/indent
  214. [{ direction: "rtl" }], // text direction
  215. [{ size: ["small", false, "large", "huge"] }], // custom dropdown
  216. [{ header: [1, 2, 3, 4, 5, 6, false] }],
  217. [{ font: [] }],
  218. ["clean"], // remove formatting button
  219. ["link", "image"]
  220. ],
  221. imageResize: {}
  222. }
  223. }
  224. };
  225. },
  226. // computed: {
  227. // radio() {
  228. // if (this.form.orderType === 2 || this.form.orderType === 5 || this.form.orderType === 8) {
  229. // this.radio = "1"
  230. // } else if (this.form.orderType === 9) {
  231. // this.radio = "2"
  232. // } else {
  233. // this.radio = "3"
  234. // }
  235. // }
  236. // },
  237. watch: {
  238. 'form.orderType': {
  239. handler() {
  240. if (this.form.orderType === 2 || this.form.orderType === 5 || this.form.orderType === 8) {
  241. this.radio = "1"
  242. } else if (this.form.orderType === 9) {
  243. this.radio = "2"
  244. } else {
  245. this.radio = "3"
  246. }
  247. }
  248. }
  249. },
  250. mounted() {
  251. console.log(this.$route.query);
  252. const type = this.$route.query.type;
  253. if (type === "create") {
  254. this.action = "create"
  255. this.getAllChoice()
  256. } else if (type === "edit") {
  257. this.action = "create"
  258. this.id = this.$route.query.id
  259. this.hasSave = true
  260. this.getAllChoice()
  261. this.getOrder()
  262. }
  263. },
  264. methods: {
  265. async getAllChoice() {
  266. let res = await this.$post("/api/admin/order/get_all_choice", {
  267. action: this.action
  268. });
  269. if (res) {
  270. console.log(res)
  271. const allChoice = res.data
  272. this.orderTypes = allChoice.order_types
  273. this.productTypes = allChoice.product_types
  274. this.channels = allChoice.channels
  275. this.orderState = allChoice.order_state
  276. }
  277. },
  278. async getOrder() {
  279. let res = await this.$post("/api/admin/order/get", {
  280. order_id: this.id
  281. });
  282. if (res) {
  283. if (res.status === 1 && res.data) {
  284. const data = res.data
  285. this.form.uid = data.uid || ""
  286. this.form.productTitle = data.product_title || ""
  287. this.form.productType = data.product_type || ""
  288. this.form.orderType = data.order_type || ""
  289. this.form.price = data.price.replace("-","") || ""
  290. this.form.channel = data.channel || ""
  291. this.form.outOrderId = data.out_order_id || ""
  292. this.form.productId = data.product_id || ""
  293. this.form.originOrderNo = data.origin_order_no || ""
  294. this.form.publicComment = data.public_comment || ""
  295. this.form.privateComment = data.private_comment || ""
  296. this.form.orderNo = data.order_no || ""
  297. this.form.status = data.status || ""
  298. this.form.productTypeName = data.product_type_name || ""
  299. this.form.orderTypeName = data.order_type_name || ""
  300. this.form.channelName = data.channel_name || ""
  301. console.log(this.form)
  302. }
  303. }
  304. },
  305. async saveOrder() {
  306. const data = {
  307. id: this.id,
  308. uid: this.form.uid,
  309. product_title: this.form.productTitle,
  310. product_type: this.form.productType,
  311. order_type: this.form.orderType,
  312. price: this.form.price,
  313. channel: this.form.channel,
  314. out_order_id: this.form.outOrderId,
  315. origin_order_no: this.form.originOrderNo,
  316. public_comment: this.form.publicComment,
  317. private_comment: this.form.privateComment
  318. }
  319. this.saveData = data
  320. let res = await this.$post("/api/admin/order/create", data)
  321. if (res) {
  322. if (res.status === 1) {
  323. this.id = res.data.id
  324. this.saveData.id = res.data.id
  325. this.form.orderNo = res.data.order_no
  326. this.hasSave = true
  327. this.$message({
  328. message: "保存成功",
  329. type: "success"
  330. })
  331. } else if (res.status === -2) {
  332. this.$message({
  333. message: `当前订单用户的账户余额不足(可用余额${res.data.can_use}元),操作失败!`,
  334. type: "error"
  335. })
  336. } else if (res.info) {
  337. console.log(res.info)
  338. }
  339. }
  340. },
  341. async confirmOrder() {
  342. const data = {
  343. id: this.id,
  344. uid: this.form.uid,
  345. product_title: this.form.productTitle,
  346. product_type: this.form.productType,
  347. order_type: this.form.orderType,
  348. price: this.form.price,
  349. channel: this.form.channel,
  350. out_order_id: this.form.outOrderId,
  351. origin_order_no: this.form.originOrderNo,
  352. public_comment: this.form.publicComment,
  353. private_comment: this.form.privateComment
  354. }
  355. const confirmData = data
  356. const saveData = this.saveData
  357. const isConfirm = true
  358. for (const key in confirmData) {
  359. if (confirmData[key] !== saveData[key]) {
  360. console.log(confirmData[key],saveData[key])
  361. this.$message({
  362. message: '与保存订单不一致,请先保存订单!',
  363. type: 'warning'
  364. })
  365. return
  366. }
  367. }
  368. let res = await this.$post("/api/admin/order/confirm_order", data)
  369. if (res) {
  370. if (res.status === 1) {
  371. this.$message({
  372. message: "提交成功",
  373. type: "success"
  374. })
  375. setTimeout(() => {
  376. this.$router.push('/main/artificial_orders')
  377. }, 1000)
  378. } else if (res.info) {
  379. console.log(res.info)
  380. }
  381. }
  382. },
  383. saveSubmit() {
  384. this.$refs['form'].validate(valid => {
  385. if (valid) {
  386. this.saveOrder()
  387. } else {
  388. console.log("error submit!!")
  389. return false
  390. }
  391. })
  392. },
  393. confirmSubmit() {
  394. this.$refs['form'].validate(valid => {
  395. if (valid) {
  396. this.$confirm(`确认提价订单后,${this.form.uid}的账户将${this.form.orderTypeName}${this.form.price}元 ,交易方式为${this.form.channelName},请您再次确认操作!`, '提示', {
  397. confirmButtonText: '确定',
  398. cancelButtonText: '取消',
  399. type: 'warning'
  400. }).then(() => {
  401. this.confirmOrder()
  402. }).catch(() => {
  403. this.$message({
  404. type: 'info',
  405. message: '已取消提交'
  406. })
  407. })
  408. } else {
  409. console.log("error submit!!")
  410. return false
  411. }
  412. })
  413. },
  414. cancelSubmit() {
  415. this.$router.push('/main/artificial_orders')
  416. },
  417. productTypeChange() {
  418. const productTypeObject = this.productTypes.find((element) => {
  419. return element.name === this.form.productTypeName
  420. })
  421. this.form.productType = productTypeObject.id
  422. },
  423. orderTypeChange() {
  424. const orderTypeObject = this.orderTypes.find((element) => {
  425. return element.name === this.form.orderTypeName
  426. })
  427. this.form.orderType = orderTypeObject.id
  428. },
  429. channelChange() {
  430. const channelObject = this.channels.find((element) => {
  431. return element.name === this.form.channelName
  432. })
  433. this.form.channel = channelObject.id
  434. }
  435. }
  436. };
  437. </script>
  438. <style lang="scss" scoped>
  439. .box-card {
  440. margin-bottom: 10px;
  441. width: 100%;
  442. }
  443. .header {
  444. font-size: 24px;
  445. color: #222222;
  446. font-weight: 600;
  447. }
  448. .clearfix:before,
  449. .clearfix:after {
  450. display: table;
  451. content: "";
  452. }
  453. .clearfix:after {
  454. clear: both;
  455. }
  456. .order-number {
  457. display: flex;
  458. align-items: center;
  459. }
  460. .order-number span:first-child {
  461. flex: 1;
  462. font-size: 14px;
  463. color: #999999;
  464. }
  465. .order-number span:nth-child(2) {
  466. font-size: 14px;
  467. color: #999999;
  468. }
  469. .order-status {
  470. display: block;
  471. margin-left: 7px;
  472. padding: 0 2px;
  473. height: 22px;
  474. line-height: 22px;
  475. border: 1px solid #3c95ff;
  476. font-size: 12px;
  477. color: #308eff;
  478. }
  479. .el-select {
  480. width: 100%;
  481. }
  482. .editer {
  483. width: 100%;
  484. height: 600px;
  485. padding: 0 0 50px;
  486. }
  487. .save-btn {
  488. width: 100px;
  489. height: 40px;
  490. }
  491. .cancel-btn {
  492. margin-left: 10px;
  493. width: 100px;
  494. height: 40px;
  495. }
  496. .comfirm-btn {
  497. width: 210px;
  498. height: 40px;
  499. }
  500. </style>