作者 xudada

制单

@@ -79,6 +79,17 @@ export default { @@ -79,6 +79,17 @@ export default {
79 } 79 }
80 }); 80 });
81 }, 81 },
  82 + getPDF(url, params) {
  83 + return axios({
  84 + method: 'GET',
  85 + url: url,
  86 + responseType: 'blob',
  87 + params: params,
  88 + headers: {
  89 + 'Content-Type': 'application/x-www-form-urlencoded'
  90 + }
  91 + });
  92 + },
82 put(url, params){ 93 put(url, params){
83 return axios({ 94 return axios({
84 method: 'PUT', 95 method: 'PUT',
  1 +import http from "../http";
  2 +import axios from "axios";
  3 +let baseUrl = 'zhidan-service'
  4 +
  5 +//pdf导出
  6 +export const extPdf = params => { return http.getPDF(`${baseUrl}/zhidan/extpdf`, params); };
  7 +//excel导出
  8 +export const extExcel = params => { return http.getPDF(`${baseUrl}/zhidan/extexcel`, params); };
  9 +//导入excel
  10 +export const importExcel = params => { return http.postExcelData(`${baseUrl}/zhidan/importexcel`, params); };
  11 +//查询列表
  12 +export const selectLists = params => { return axios.get(`${baseUrl}/zhidan/selectLists`, { params: params }); };
  13 +
  14 +//费率新增
  15 +export const addRate = params =>{return http.post(`${baseUrl}/rate/addRate`, params);};
  16 +//费率删除
  17 +export const delRate = params => { return axios.get(`${baseUrl}/rate/delRate`, { params: params }); };
  18 +//费率更新
  19 +export const ediRate = params =>{return http.post(`${baseUrl}/rate/ediRate`, params);};
  20 +//费率查询
  21 +export const selectRate = params => { return axios.get(`${baseUrl}/rate/selectRate`, { params: params }); };
@@ -197,6 +197,10 @@ import satellite from "./views/deploy/satellite"; @@ -197,6 +197,10 @@ import satellite from "./views/deploy/satellite";
197 import ExortOrder from './views/exportorder/Exportorder.vue' 197 import ExortOrder from './views/exportorder/Exportorder.vue'
198 import CustomerConfig from './views/exportorder/CustomerConfig.vue' 198 import CustomerConfig from './views/exportorder/CustomerConfig.vue'
199 199
  200 +/*制单管理*/
  201 +import ZhiDan from './views/zhidan/zhidan.vue'
  202 +import Rate from './views/zhidan/rate.vue'
  203 +
200 let routes = [ 204 let routes = [
201 { 205 {
202 path: '/login', 206 path: '/login',
@@ -231,6 +235,16 @@ let routes = [ @@ -231,6 +235,16 @@ let routes = [
231 ] 235 ]
232 }, 236 },
233 { 237 {
  238 + path: '/zhidan',
  239 + component: HomeNew,
  240 + name: '制单管理',
  241 + iconCls: 'el-icon-collection',
  242 + children: [
  243 + {path: '/ZhiDan', component: ZhiDan, name: '制单信息'},
  244 + {path: '/Rate', component: Rate, name: '费率设置'}
  245 + ]
  246 + },
  247 + {
234 path: '/', 248 path: '/',
235 component: HomeNew, 249 component: HomeNew,
236 name: 'Charts', 250 name: 'Charts',
  1 +<template>
  2 + <div>
  3 + <el-row :gutter="24">
  4 + <el-col :span="4">
  5 + <el-input size="medium" v-model="query.carrier" onkeyup="this.value=this.value.toUpperCase()" placeholder="承运人二字码"></el-input>
  6 + </el-col>
  7 + <el-col :span="4">
  8 + <el-input size="medium" v-model="query.dest" onkeyup="this.value=this.value.toUpperCase()" placeholder="目的港"></el-input>
  9 + </el-col>
  10 + <el-col :span="2">
  11 + <el-button size="medium" @click="getList" type="primary">查询</el-button>
  12 + </el-col>
  13 + <el-col :span="2">
  14 + <el-button size="medium" @click="add" type="primary">新增</el-button>
  15 + </el-col>
  16 + </el-row>
  17 + <el-row :gutter="24">
  18 + <el-col :span="24">
  19 + <el-table
  20 + :data="tableData"
  21 + border
  22 + style="width: 100%">
  23 + <el-table-column
  24 + prop="carrier"
  25 + label="承运人二字码"
  26 + width="120">
  27 + </el-table-column>
  28 + <el-table-column
  29 + prop="dest"
  30 + label="目的港"
  31 + width="120">
  32 + </el-table-column>
  33 + <el-table-column
  34 + prop="destrate"
  35 + label="目的港费率"
  36 + width="120">
  37 + </el-table-column>
  38 + <el-table-column
  39 + prop="mycname"
  40 + label="燃油费类型"
  41 + width="120">
  42 + </el-table-column>
  43 + <el-table-column
  44 + prop="myc"
  45 + label="燃油费率"
  46 + width="120">
  47 + </el-table-column>
  48 + <el-table-column
  49 + prop="sccname"
  50 + label="战险类型"
  51 + width="120">
  52 + </el-table-column>
  53 + <el-table-column
  54 + prop="scc"
  55 + label="战险费率"
  56 + width="120">
  57 + </el-table-column>
  58 + <el-table-column
  59 + prop="zhidanfei"
  60 + label="制单费"
  61 + width="120">
  62 + </el-table-column>
  63 + <el-table-column
  64 + prop="cgc"
  65 + label="信息传输费"
  66 + width="120">
  67 + </el-table-column>
  68 + <el-table-column
  69 + fixed="right"
  70 + label="操作"
  71 + width="100">
  72 + <template slot-scope="scope">
  73 + <el-button @click="handleClick(scope.row)" type="text" size="small">编辑</el-button>
  74 + <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
  75 + </template>
  76 + </el-table-column>
  77 + </el-table>
  78 + </el-col>
  79 + <el-col :span="24">
  80 + <div class="block">
  81 + <el-pagination
  82 + @size-change="handleSizeChange"
  83 + @current-change="handleCurrentChange"
  84 + :current-page="query.pageNum"
  85 + :page-sizes="[10, 20, 30, 40]"
  86 + :page-size="query.pageSize"
  87 + layout="total, sizes, prev, pager, next, jumper"
  88 + :total="total">
  89 + </el-pagination>
  90 + </div>
  91 + </el-col>
  92 + </el-row>
  93 +
  94 + <el-dialog
  95 + title="费率信息"
  96 + :visible.sync="dialogVisible"
  97 + width="30%"
  98 + :before-close="handleClose">
  99 + <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  100 + <el-form-item label="目的港" prop="dest">
  101 + <el-input v-model="ruleForm.dest" onkeyup="this.value=this.value.toUpperCase()"></el-input>
  102 + </el-form-item>
  103 + <el-form-item label="目的港费率" prop="destrate">
  104 + <el-input v-model="ruleForm.destrate" type="number"></el-input>
  105 + </el-form-item>
  106 + <el-form-item label="承运人二字码" prop="carrier">
  107 + <el-input v-model="ruleForm.carrier" onkeyup="this.value=this.value.toUpperCase()"></el-input>
  108 + </el-form-item>
  109 + <el-form-item label="燃油费类型:" prop="mycname">
  110 + <el-input v-model="ruleForm.mycname" onkeyup="this.value=this.value.toUpperCase()"></el-input>
  111 + </el-form-item>
  112 + <el-form-item label="燃油费率" prop="myc">
  113 + <el-input v-model="ruleForm.myc" type="number"></el-input>
  114 + </el-form-item>
  115 + <el-form-item label="战险类型" prop="sccname">
  116 + <el-input v-model="ruleForm.sccname" onkeyup="this.value=this.value.toUpperCase()"></el-input>
  117 + </el-form-item>
  118 + <el-form-item label="战险费率" prop="scc">
  119 + <el-input v-model="ruleForm.scc" type="number"></el-input>
  120 + </el-form-item>
  121 + <el-form-item label="制单费" prop="zhidanfei">
  122 + <el-input v-model="ruleForm.zhidanfei" type="number"></el-input>
  123 + </el-form-item>
  124 + <el-form-item label="信息传输费" prop="cgc">
  125 + <el-input v-model="ruleForm.cgc" type="number"></el-input>
  126 + </el-form-item>
  127 + <el-form-item>
  128 + <el-button type="primary" @click="dialogStatus==='create'?addForm('ruleForm'):ediForm('ruleForm')">保存</el-button>
  129 + <el-button @click="resetForm('ruleForm')">重置</el-button>
  130 + </el-form-item>
  131 + </el-form>
  132 + </el-dialog>
  133 +
  134 + </div>
  135 +</template>
  136 +<script>
  137 + import {addRate,delRate,ediRate,selectRate} from "../../api/zhidan/zhidan";
  138 + export default {
  139 + data(){
  140 + return{
  141 + ruleForm: {
  142 + id:'',
  143 + carrier: '',
  144 + dest:'',
  145 + destrate:0,
  146 + myc:0,
  147 + scc:0,
  148 + zhidanfei:0,
  149 + mycname:'',
  150 + sccname:'',
  151 + cgc:0,
  152 + },
  153 + rules: {
  154 +
  155 + },
  156 + query:{
  157 + carrier:'',
  158 + dest:'',
  159 + pageNum:1,
  160 + pageSize:20
  161 + },
  162 + total:0,
  163 + tableData:[],
  164 + dialogVisible:false,
  165 + dialogStatus: '',
  166 + }
  167 + },
  168 + mounted() {
  169 + this.getList();
  170 + },
  171 + methods:{
  172 + addForm(formName) {
  173 + this.$refs[formName].validate((valid) => {
  174 + if (valid) {
  175 + addRate(this.ruleForm).then((response) => {
  176 + const res = response.data
  177 + if (res.code !== '200') {
  178 + return this.$message.error('费率新增,失败!')
  179 + }
  180 + this.$message.success('费率新增,成功!')
  181 + this.dialogVisible = false;
  182 + this.getList();
  183 + }).catch(error => {
  184 + // 关闭加载
  185 + this.$message.warning('费率新增,失败!')
  186 + })
  187 + } else {
  188 + console.log('error submit!!');
  189 + return false;
  190 + }
  191 + });
  192 + },
  193 + ediForm(formName) {
  194 + this.$refs[formName].validate((valid) => {
  195 + if (valid) {
  196 + ediRate(this.ruleForm).then((response) => {
  197 + const res = response.data
  198 + if (res.code !== '200') {
  199 + return this.$message.error('费率更新,失败!')
  200 + }
  201 + this.$message.success('费率更新,成功!')
  202 + this.dialogVisible = false;
  203 + this.getList();
  204 + }).catch(error => {
  205 + // 关闭加载
  206 + this.$message.warning('费率更新,失败!')
  207 + })
  208 + } else {
  209 + console.log('error submit!!');
  210 + return false;
  211 + }
  212 + });
  213 + },
  214 + resetForm(formName) {
  215 + this.$refs[formName].resetFields();
  216 + },
  217 + add(){
  218 + this.ruleForm={
  219 + id:'',
  220 + carrier: '',
  221 + dest:'',
  222 + destrate:0,
  223 + myc:0,
  224 + scc:0,
  225 + zhidanfei:0,
  226 + mycname:'',
  227 + sccname:'',
  228 + cgc:0,
  229 + }
  230 + this.dialogVisible=true;
  231 + this.dialogStatus='create';
  232 + },
  233 + handleClose(done) {
  234 + this.$confirm('确认关闭?')
  235 + .then(_ => {
  236 + done();
  237 + })
  238 + .catch(_ => {});
  239 + },
  240 + handleClick(row) {
  241 + this.dialogVisible=true;
  242 + this.dialogStatus='update';
  243 + this.ruleForm=row;
  244 + },
  245 + deleteClick(row) {
  246 + this.$confirm('此操作永久删除该消息收发记录, 是否继续?', '警告', {
  247 + confirmButtonText: '确定删除',
  248 + cancelButtonText: '取消',
  249 + type: 'warning'
  250 + }
  251 + ).then(() => {
  252 + delRate({id: row.id}).then((response) => {
  253 + const res = response.data
  254 + this.$message.success(res.msg)
  255 + this.getList();
  256 + }).catch(error => {
  257 + this.$message.error('删除配置,失败!')
  258 + })
  259 + }).catch(() => {
  260 + })
  261 + },
  262 + handleSizeChange(val) {
  263 + this.query.pageSize=val;
  264 + this.getList();
  265 + },
  266 + handleCurrentChange(val) {
  267 + this.query.pageNum=val;
  268 + this.getList();
  269 + },
  270 + getList(){
  271 + selectRate(this.query).then((response) => {
  272 + const res = response.data
  273 + if (res.code !== '200') {
  274 + return this.$message.error('获取消息收发记录,失败!')
  275 + }
  276 + // 获取列表数据
  277 + this.tableData = res.data.list
  278 + // 获取列表的总记录数
  279 + this.total = res.data.total
  280 + this.$message.success('获取消息收发记录,成功!');
  281 + }).catch(error => {
  282 + // 关闭加载
  283 + this.$message.error(error.toString())
  284 + })
  285 + },
  286 + validateUppercaseInput() {
  287 + // 使用正则表达式来匹配非大写字母,并替换为空字符串
  288 + this.uppercaseInput = this.uppercaseInput.replace(/[^A-Z]/g, '');
  289 + }
  290 + }
  291 + }
  292 +</script>
  1 +<template>
  2 + <div>
  3 + <el-row :gutter="24">
  4 + <el-col :span="4">
  5 + <el-input size="medium" v-model="query.waybill" placeholder="运单号"></el-input>
  6 + </el-col>
  7 + <el-col :span="9">
  8 + <el-date-picker
  9 + size="medium"
  10 + v-model="value2"
  11 + type="datetimerange"
  12 + :picker-options="pickerOptions"
  13 + range-separator="至"
  14 + start-placeholder="开始日期"
  15 + end-placeholder="结束日期"
  16 + align="right">
  17 + </el-date-picker>
  18 + </el-col>
  19 + <el-col :span="2">
  20 + <el-button size="medium" @click="getList" type="primary">查询</el-button>
  21 + </el-col>
  22 + <el-col :span="2">
  23 + <el-upload
  24 + class="upload-demo"
  25 + action=""
  26 + :before-upload="beforeUpload"
  27 + :http-request="impExcel"
  28 + :show-file-list="false">
  29 + <el-button size="medium" type="success">导入数据</el-button>
  30 + </el-upload>
  31 + </el-col>
  32 + </el-row>
  33 + <el-row :gutter="24">
  34 + <el-col :span="24">
  35 + <el-table
  36 + :data="tableData"
  37 + border
  38 + style="width: 100%">
  39 + <el-table-column
  40 + prop="waybill"
  41 + label="运单号"
  42 + width="120">
  43 + </el-table-column>
  44 + <!--<el-table-column
  45 + prop="fhl"
  46 + label="分单号"
  47 + width="120">
  48 + </el-table-column>-->
  49 + <el-table-column
  50 + prop="flightno"
  51 + label="航班号"
  52 + width="120">
  53 + </el-table-column>
  54 + <el-table-column
  55 + prop="flightdate"
  56 + label="航班日期"
  57 + width="150">
  58 + </el-table-column>
  59 + <el-table-column
  60 + prop="pcs"
  61 + label="件数"
  62 + width="120">
  63 + </el-table-column>
  64 + <el-table-column
  65 + prop="weight"
  66 + label="重量"
  67 + width="120">
  68 + </el-table-column>
  69 + <el-table-column
  70 + prop="feweifht"
  71 + label="计费重"
  72 + width="120">
  73 + </el-table-column>
  74 + <el-table-column
  75 + prop="vol"
  76 + label="体积"
  77 + width="120">
  78 + </el-table-column>
  79 + <el-table-column
  80 + prop="descr"
  81 + label="品名"
  82 + width="120">
  83 + </el-table-column>
  84 + <el-table-column
  85 + fixed="right"
  86 + label="操作"
  87 + width="160">
  88 + <template slot-scope="scope">
  89 + <el-button @click="handlePdf(scope.row)" type="text" size="small">下载PDF</el-button>
  90 + <el-button @click="handleExcel(scope.row)" type="text" size="small">下载EXCEL</el-button>
  91 + </template>
  92 + </el-table-column>
  93 + </el-table>
  94 + </el-col>
  95 + <el-col :span="24">
  96 + <el-pagination
  97 + size="medium"
  98 + @size-change="handleSizeChange"
  99 + @current-change="handleCurrentChange"
  100 + :current-page="query.pageNum"
  101 + :page-sizes="[100, 200, 300, 400]"
  102 + :page-size="query.pageSize"
  103 + layout="total, sizes, prev, pager, next, jumper"
  104 + :total="total">
  105 + </el-pagination>
  106 + </el-col>
  107 + </el-row>
  108 + </div>
  109 +</template>
  110 +<script>
  111 + import {selectLists,extPdf,extExcel,importExcel} from "../../api/zhidan/zhidan";
  112 +
  113 + export default {
  114 + data(){
  115 + return{
  116 + pickerOptions: {
  117 + shortcuts: [
  118 + {
  119 + text: '最近一周',
  120 + onClick(picker) {
  121 + const end = new Date();
  122 + const start = new Date();
  123 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  124 + picker.$emit('pick', [start, end]);
  125 + }
  126 + }, {
  127 + text: '最近一个月',
  128 + onClick(picker) {
  129 + const end = new Date();
  130 + const start = new Date();
  131 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  132 + picker.$emit('pick', [start, end]);
  133 + }
  134 + }, {
  135 + text: '最近三个月',
  136 + onClick(picker) {
  137 + const end = new Date();
  138 + const start = new Date();
  139 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  140 + picker.$emit('pick', [start, end]);
  141 + }
  142 + }
  143 + ]
  144 + },
  145 + query:{
  146 + waybill:'',
  147 + starttime:'',
  148 + endtime:'',
  149 + pageNum:1,
  150 + pageSize:20
  151 + },
  152 + value2:'',
  153 + tableData: [],
  154 + total:0,
  155 + }
  156 + },
  157 + mounted() {
  158 + this.getList();
  159 + },
  160 + methods:{
  161 + //导入订单excel
  162 + beforeUpload(file) {
  163 + // 检查文件类型
  164 + const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type === 'application/vnd.ms-excel';
  165 + if (!isExcel) {
  166 + this.$message.error('上传文件只能是 Excel 格式!');
  167 + return false; // 取消文件上传
  168 + }
  169 + return true; // 允许上传
  170 +
  171 + },
  172 + impExcel({ file, onSuccess, onError }){
  173 + // 生成 FormData 对象
  174 + const formData = new FormData();
  175 + formData.append('file', file);
  176 + importExcel(formData).then((response) => {
  177 + const res = response.data
  178 + if (res.code !== '200') {
  179 + return this.$message.error(res.msg);
  180 + }
  181 + this.$message.success(res.msg);
  182 + this.getList();
  183 + onSuccess(response.data); // 调用 onSuccess 回调通知上传成功
  184 + }).catch(error => {
  185 + // 关闭加载
  186 + this.$message.error(error.toString())
  187 + onError(error); // 调用 onError 回调通知上传失败
  188 + })
  189 + },
  190 + getList(){
  191 + if(this.value2 !== null && this.value2 !== ""){
  192 + this.query.starttime=this.value2[0];
  193 + this.query.endtime=this.value2[1];
  194 + }
  195 + selectLists(this.query).then((response) => {
  196 + const res = response.data
  197 + if (res.code !== '200') {
  198 + return this.$message.error('获取消息收发记录,失败!')
  199 + }
  200 + // 获取列表数据
  201 + this.tableData = res.data.list
  202 + // 获取列表的总记录数
  203 + this.total = res.data.total
  204 + this.$message.success('获取消息收发记录,成功!');
  205 + }).catch(error => {
  206 + // 关闭加载
  207 + this.$message.error(error.toString())
  208 + })
  209 + },
  210 + handlePdf(row) {
  211 + extPdf({id: row.id}).then(response => {
  212 + const url = window.URL.createObjectURL(new Blob([response.data]));
  213 + const link = document.createElement('a');
  214 + link.href = url;
  215 + link.setAttribute('download', row.waybill+'.pdf'); // 动态设置文件名
  216 + document.body.appendChild(link);
  217 + link.click();
  218 + document.body.removeChild(link); // 清理临时链接
  219 + window.URL.revokeObjectURL(url); // 清理URL对象
  220 + }).catch(error => {
  221 + console.error('Error downloading PDF:', error);
  222 + });
  223 + },
  224 + handleExcel(row) {
  225 + extExcel({id: row.id}).then(response => {
  226 + if (!response || !response.data) {
  227 + console.error('Response data is empty or not a Blob.');
  228 + return;
  229 + }
  230 +
  231 + const blob = new Blob([response.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
  232 + const tempFile = URL.createObjectURL(blob);
  233 +
  234 + fetch(tempFile)
  235 + .then(res => res.blob())
  236 + .then(blob => {
  237 + const url = window.URL.createObjectURL(blob);
  238 + const link = document.createElement('a');
  239 + link.href = url;
  240 + link.setAttribute('download', row.waybill+'.xlsx');
  241 + document.body.appendChild(link);
  242 + link.click();
  243 + document.body.removeChild(link);
  244 + window.URL.revokeObjectURL(url);
  245 + })
  246 + .catch(error => {
  247 + console.error('Error creating temporary file:', error);
  248 + });
  249 +
  250 + window.URL.revokeObjectURL(tempFile);
  251 + }).catch(error => {
  252 + console.error('Error downloading Excel:', error);
  253 + });
  254 + },
  255 + handleSizeChange(val) {
  256 + this.query.pageSize=val;
  257 + this.getList();
  258 + },
  259 + handleCurrentChange(val) {
  260 + this.query.pageNum=val;
  261 + this.getList();
  262 + }
  263 + }
  264 + }
  265 +</script>