Commit c9015f69 authored by daniel's avatar daniel

feat(gk): 赛包+发票

parent 042cd241
......@@ -75,6 +75,7 @@ public class ResourcesController {
obj.put("scene", "raceId=" + cmptid);
// 修改为小程序页面路径 by 2025-06-12
obj.put("page", "pages/race/raceHome");
obj.put("width", "1280");
String partnerId = cmptService.getPartnerId(cmptid);
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
try {
......
......@@ -40,6 +40,7 @@ public class ServiceSettingController {
@RequestMapping(value = "/page/{id}", method = RequestMethod.GET)
@PageView
public ModelAndView page(@PathVariable("id") String id, ModelAndView mv) {
mv.setViewName("cmpt/detail");
RichText richText = richTextService.getById(id);
......
package com.dlbridge.jadp.plugins.partner.controller;
import com.dlbridge.jadp.common.interceptor.PageView;
import com.dlbridge.jadp.job.CountJob;
import com.dlbridge.jadp.plugins.cmpt.bean.Banner;
import com.dlbridge.jadp.plugins.cmpt.dao.model.Cmpt;
import com.dlbridge.jadp.plugins.cmpt.service.CmptService;
import com.dlbridge.jadp.plugins.cmpt.utils.Page;
import com.dlbridge.jadp.plugins.partner.bean.BagDelivery;
import com.dlbridge.jadp.plugins.partner.bean.BagParam;
......@@ -8,6 +13,7 @@ import com.neusoft.www.utils.web.Result;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import java.util.List;
......@@ -19,6 +25,18 @@ public class BagDeliveryController {
@Resource
private BagDeliveryService bagDeliveryService;
@Resource
private CmptService cmptService;
@RequestMapping("index/{cmptId}")
@PageView
public ModelAndView index(@PathVariable("cmptId") Integer cmptId, ModelAndView mv) {
Cmpt cmpt = cmptService.queryCmptBycmptId(cmptId);
mv.addObject("cmpt", cmpt);
mv.setViewName("cmpt/bag");
return mv;
}
/**
* 赛包邮寄申请列表
* @param page 分页参数
......
package com.dlbridge.jadp.plugins.partner.controller;
import com.dlbridge.jadp.common.interceptor.PageView;
import com.dlbridge.jadp.plugins.cmpt.dao.model.Cmpt;
import com.dlbridge.jadp.plugins.cmpt.service.CmptService;
import com.dlbridge.jadp.plugins.cmpt.utils.Page;
import com.dlbridge.jadp.plugins.partner.bean.Invoice;
import com.dlbridge.jadp.plugins.partner.bean.BagParam;
......@@ -9,6 +12,7 @@ import com.neusoft.www.utils.web.Result;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
......@@ -21,6 +25,18 @@ public class InvoiceController {
@Resource
private InvoiceService invoiceService;
@Resource
private CmptService cmptService;
@RequestMapping("index/{cmptId}")
@PageView
public ModelAndView index(@PathVariable("cmptId") Integer cmptId, ModelAndView mv) {
Cmpt cmpt = cmptService.queryCmptBycmptId(cmptId);
mv.addObject("cmpt", cmpt);
mv.setViewName("cmpt/invoice");
return mv;
}
/**
* 赛包邮寄申请列表
* @param page 分页参数
......
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!doctype html>
<html>
<head>
<title>赛包邮寄</title>
<!-- Bootstrap CSS-->
<link rel="stylesheet" href="${ctxStatic}/newdermon/vendor/bootstrap/css/bootstrap.min.css">
<!-- Font Awesome CSS-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/vendor/font-awesome/css/font-awesome.min.css">
<!-- Fontastic Custom icon font-->
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/fontastic.css">
<!-- Google fonts - Poppins -->
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/font-css.css">
<!-- theme stylesheet-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/style.default.css?v=<%=System.currentTimeMillis()%>"
id="theme-stylesheet">
<!-- Custom stylesheet - for your changes-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/custom.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/juery-ui-1.12.css">
<!-- Favicon-->
<link rel="shortcut icon" href="https://img.geexek.com/files/home/favicon.ico">
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/custom.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/main.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet" href="${ctxStatic}/cmpt/setting.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet"
href="${ctxStatic}/leaflet/css/leaflet.css?v=<%=System.currentTimeMillis()%>" />
<link rel="stylesheet" href="${ctxStatic}/leaflet/css/leaflet_label.css" />
<!-- Bootstrap CSS-->
<link rel="stylesheet" href="${ctxStatic}/css/base.css">
<script src="${ctxStatic}/My97DatePicker/WdatePicker.js" type="text/javascript"></script>
<script src="${ctxStatic}/newdermon/vendor/jquery/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="${ctxStatic}/layer/layer.js"></script>
<link rel="stylesheet" href="${ctxStatic}/layer/skin/layer.css">
<link rel="stylesheet" href="/static/cmpt/score.css?<%=System.currentTimeMillis()%>">
<style>
.layui-layer-title {
color: white;
}
.layui-layer-btn {
color: white;
}
.action {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
}
.dialog {
width: 40vw;
max-height: 80vh;
height: auto;
z-index: 99;
display: flex;
flex-direction: column;
left: 50%;
transform: translateX(-50%);
margin-left: 0;
padding: 20px;
border-radius: 10px;
}
.dialog input {
width: 100% !important;
}
.action div {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
user-select: none;
}
.submit {
display: inline-block;
width: 120px;
height: 45px;
text-align: center;
line-height: 45px;
color: white;
background: #ce3939;
border-radius: 4px;
letter-spacing: 1px;
cursor: pointer;
font-size: 16px;
}
.cancel {
width: 120px;
height: 45px;
background: #949494;
border-radius: 4px;
font-size: 16px;
color: #FFFFFF;
line-height: 45px;
text-align: center;
margin-right: 20px;
}
.input {
width: 100%;
height: 40px !important;
line-height: 40px !important;
border: 2px solid #F4F4F4;
border-radius: 4px;
margin-right: 30px;
margin-left: 0px;
padding-left: 12px;
background: rgba(247, 247, 247, 1);
border-radius: 4px;
border: 1px solid rgba(229, 229, 229, 1);
}
.title {
font-size: 24px;
font-weight: 500;
color: rgba(51, 51, 51, 1);
}
.form-label {
font-size: 15px;
color: rgb(92, 91, 91);
width: auto;
}
.form-item {
display: flex;
flex-direction: column;
/* height: 90px; */
padding: 5px 0;
}
.section {
display: flex;
background: rgba(255, 255, 255, 1);
border-radius: 4px;
flex-direction: column;
}
.tip {
font-size: 16px;
color: rgba(51, 51, 51, 1);
position: absolute;
right: 45px;
top: 10px;
}
.form-action {
display: flex;
justify-content: flex-end;
margin: 0 20px;
padding-top: 10px;
}
label {
/* width: auto; */
/* width: 200px; */
display: flex;
flex-direction: row;
align-items: center;
}
.label-box {
display: flex;
flex-direction: row;
align-items: center;
}
.dialog label input {
width: 20px !important;
height: 20px !important;
margin: 0 10px !important;
}
.cover {
width: 100%;
height: 100px;
background: rgba(247, 247, 247, 1);
border-radius: 4px;
border: 1px solid rgba(238, 238, 238, 1);
display: flex;
justify-content: center;
align-items: center;
}
.cover-img {
width: 300px;
cursor: pointer;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
height: 300px;
}
.icon-cover {
width: 34px;
height: 34px;
background-image: url("/static/images/icon_cover.png");
background-size: 100%;
background-repeat: no-repeat;
}
.section {
width: 100% !important;
display: flex;
flex-direction: column;
}
.rule-field tbody tr td:first-child {
padding-left: 5px !important;
height: auto !important;
}
tbody tr td {
font-size: 15px !important;
padding: 5px;
}
input[type=checkbox]::before {
border: none !important;
background: none !important;
}
input[type=checkbox]:checked::before {
border: none !important;
background: none !important;
}
input[type=checkbox] {
top: 0;
left: 0;
}
</style>
</head>
<body>
<jsp:include page="../common/header.jsp"></jsp:include>
<div class="page-content d-flex align-items-stretch main-body">
<jsp:include page="../common/menu.jsp"></jsp:include>
<div class="rght" id="module">
<div class="section">
<div class="flex flex-row items-center justify-between">
<h3 class="title">赛包邮寄</h3>
<div class="btn-toolbar flex justify-between" role="toolbar"
aria-label="Toolbar with button groups">
<div class="btn-group" role="group" aria-label="First group">
<button :class="[index==statusIndex?'btn-danger':'btn-default']"
@click="changeStatus(index)" type="button"
v-for="(statusOpt,index) in statusOptions" :key="index"
class="btn btn-sm">
{{statusOpt.name}}
</button>
</div>
</div>
</div>
</div>
<div style="margin-top: -10px;margin-bottom: 50px">
<table style="width: 100%" class="rule-field">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:10%;">
<col style="width:15%;">
</colgroup>
<thead>
<tr>
<th style="text-align: left">选手</th>
<th style="text-align: left">地址</th>
<th style="text-align: left">物流</th>
<th style="text-align: left">状态</th>
<th style="text-align: center">操作</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :data-id="item.id">
<td>
<div class="flex flex-col">
<span class="lh-1.2">
姓名: {{item.name}}
</span>
<span class="lh-1.2">
参赛号:{{item.markNo}}
</span>
<span class="lh-1.2">
手机号:{{item.phone}}
</span>
<span v-if="item.remark" class="lh-1.2">
备注:{{item.remark}}
</span>
</div>
</td>
<td class="name" style="text-align: left;">
<span class="lh-1.2">
{{item.province}}/{{item.city}}/{{item.area}}/{{item.location}}
</span>
</td>
<td class="name" style="text-align: left;">
<div class="flex flex-col">
<span class="lh-1.2" class="lh-1.2">
物流单号 {{item.deliveryNo}}
</span>
<span class="lh-1.2">
物流公司 {{ item.expressCompany }}
</span>
</div>
</td>
<td style="text-align: left;">
<span class="lh-1.2">{{statusEnum[item.status]}}</span>
</td>
<td style="text-align: center">
<div class="action">
<div class="opt edit.opt" @click="showEdit(item)">
<span class="icon-edit"></span>
<span class="edit">
编辑
</span>
</div>
<div class="opt del" @click="delBag(item)">
<span class="icon-del"></span>
<span class="del">
删除
</span>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="dialog" v-show="dialog">
<div>
<span class="title" style="margin-bottom: 10px; color: #CE3939">{{title}}</span>
</div>
<div style="display: flex;flex-direction: column;flex:1;overflow-y: auto;">
<div class="form-item">
<div>
<span class="form-label">姓名</span>
</div>
<div>
<input class="input" type="text" v-model="bag.name"
placeholder="请输入收件人姓名" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">手机号</span>
</div>
<div>
<input class="input" type="text" v-model="bag.phone"
placeholder="请输入收件人手机号" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">快递单号</span>
</div>
<div>
<input class="input" type="text" v-model="bag.deliveryNo"
placeholder="请输入快递单号" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">快递公司</span>
</div>
<div>
<input class="input" type="text" v-model="bag.expressCompany"
placeholder="请输入快递公司" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">省份</span>
</div>
<div>
<input class="input" type="text" v-model="bag.province"
placeholder="请输入省份" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">城市</span>
</div>
<div>
<input class="input" type="text" v-model="bag.city"
placeholder="请输入城市" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">详细地址</span>
</div>
<div>
<input class="input" type="text" v-model="bag.area"
placeholder="请输入详细地址" />
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">备注</span>
</div>
<div>
<input class="input" type="text" v-model="bag.remark"
placeholder="请输入备注信息" />
</div>
</div>
<!-- 状态 (status) -->
<div class="form-item">
<span class="form-label">状态</span>
<div class="label-box">
<label>
<input type="radio" v-model="bag.status" value="1"> 提交
</label>
<label>
<input type="radio" v-model="bag.status" value="2"> 待处理
</label>
</div>
</div>
</div>
<div class="form-action">
<span @click="cancel" class="cancel cursor-pointer">取消</span>
<span @click="submit" class="submit">保存</span>
</div>
</div>
<div v-show="dialog"
style="position: fixed;height: 100%;width: 100%;background: black;z-index: 10;opacity: 0.5;top:0px;left:0px">
</div>
</div>
<script src="${ctxStatic}/vue/vue.js"></script>
<script>
const uploadUrl = '/api-common/v1/upload?folder=' + 'gk/module' + '&cmptId=' + getCId()
var app = new Vue({
el: '#module',
data: {
list: [],
dialog: false,
title: '赛包邮寄',
statusIndex: 0,
statusOptions: [
{
name: "全部",
value: ''
},
{
name: "提交",
value: 1
},
{
name: "待处理",
value: 2
}
],
statusEnum: {
1: "提交",
2: "待处理",
},
bag: {
"id": null,
"remarks": null,
"cmptId": getCId(),
"name": "",
"markNo": "",
"phone": "",
"area": "",
"province": "",
"city": "",
"location": "",
"deliveryNo": "",
"expressCompany": "",
"status": 1,
"remark": ""
},
statusType: {
0: '关闭',
1: '开启'
}
},
methods: {
changeStatus(index) {
this.statusIndex = index;
this.fetchData()
},
changePage(page) {
this.page = page
this.fetchData()
},
next() {
this.page += 1
this.fetchData()
},
preview() {
this.page -= 1
this.fetchData()
},
// 重置表单
resetForm() {
this.bag = {
"id": null,
"remarks": null,
"cmptId": getCId(),
"name": "",
"markNo": "",
"phone": "",
"area": "",
"province": "",
"city": "",
"location": "",
"deliveryNo": "",
"expressCompany": "",
"status": 1,
"remark": ""
};
},
// 编辑
showEdit(detail) {
this.bag = { ...detail };
this.dialog = true;
},
// 删除
delBag(data) {
layer.confirm("确认要删除吗?", function () {
$.ajax({
url: '/gk/bag/delete?id=' + data.id,
type: 'get',
contentType: 'application/json',
beforeSend: () => {
layer.load()
},
success: () => {
layer.msg('删除成功!');
},
complete: () => {
layer.closeAll()
app.fetchData();
}
});
});
},
// 保存
submit() {
const bag = { ...this.bag }
const url = "/gk/bag/update"
$.ajax({
url,
data: JSON.stringify(bag), // 将 data 转换为 JSON 字符串
type: 'post',
contentType: 'application/json',
beforeSend: () => {
layer.load()
},
success: (res) => {
layer.msg(res.code == 1 ? '保存成功!' : res.msg);
this.dialog = false;
this.fetchData();
},
complete: () => {
layer.closeAll()
}
})
},
// 返回
cancel() {
this.dialog = false;
},
// 查询所有
fetchData() {
if (!getCId()) return
const url = '/gk/bag/delivery/list?status=' + this.statusOptions[this.statusIndex].value + '&cmptId=' + getCId()
$.ajax({
type: 'GET',
contentType: 'application/json',
url,
beforeSend: () => {
layer.load()
},
complete: () => {
layer.closeAll()
},
success: (data) => {
this.list = data.content
}
})
},
}
});
app.fetchData();
</script>
</body>
</html>
\ No newline at end of file
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!doctype html>
<html>
<head>
<title>发票管理</title>
<!-- Bootstrap CSS-->
<link rel="stylesheet" href="${ctxStatic}/newdermon/vendor/bootstrap/css/bootstrap.min.css">
<!-- Font Awesome CSS-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/vendor/font-awesome/css/font-awesome.min.css">
<!-- Fontastic Custom icon font-->
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/fontastic.css">
<!-- Google fonts - Poppins -->
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/font-css.css">
<!-- theme stylesheet-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/style.default.css?v=<%=System.currentTimeMillis()%>"
id="theme-stylesheet">
<!-- Custom stylesheet - for your changes-->
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/custom.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet" href="${ctxStatic}/newdermon/css/juery-ui-1.12.css">
<!-- Favicon-->
<link rel="shortcut icon" href="https://img.geexek.com/files/home/favicon.ico">
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/custom.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet"
href="${ctxStatic}/newdermon/css/main.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet" href="${ctxStatic}/cmpt/setting.css?v=<%=System.currentTimeMillis()%>">
<link rel="stylesheet"
href="${ctxStatic}/leaflet/css/leaflet.css?v=<%=System.currentTimeMillis()%>" />
<link rel="stylesheet" href="${ctxStatic}/leaflet/css/leaflet_label.css" />
<!-- Bootstrap CSS-->
<link rel="stylesheet" href="${ctxStatic}/css/base.css">
<script src="${ctxStatic}/My97DatePicker/WdatePicker.js" type="text/javascript"></script>
<script src="${ctxStatic}/newdermon/vendor/jquery/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="${ctxStatic}/layer/layer.js"></script>
<link rel="stylesheet" href="${ctxStatic}/layer/skin/layer.css">
<link rel="stylesheet" href="/static/cmpt/score.css?<%=System.currentTimeMillis()%>">
<style>
.layui-layer-title {
color: white;
}
.layui-layer-btn {
color: white;
}
.action {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
}
.dialog {
width: 40vw;
max-height: 80vh;
height: auto;
z-index: 99;
display: flex;
flex-direction: column;
left: 50%;
transform: translateX(-50%);
margin-left: 0;
padding: 20px;
border-radius: 10px;
}
.dialog input {
width: 100% !important;
}
.action div {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
user-select: none;
}
.submit {
display: inline-block;
width: 120px;
height: 45px;
text-align: center;
line-height: 45px;
color: white;
background: #ce3939;
border-radius: 4px;
letter-spacing: 1px;
cursor: pointer;
font-size: 16px;
}
.cancel {
width: 120px;
height: 45px;
background: #949494;
border-radius: 4px;
font-size: 16px;
color: #FFFFFF;
line-height: 45px;
text-align: center;
margin-right: 20px;
}
.input {
width: 100%;
height: 40px !important;
line-height: 40px !important;
border: 2px solid #F4F4F4;
border-radius: 4px;
margin-right: 30px;
margin-left: 0px;
padding-left: 12px;
background: rgba(247, 247, 247, 1);
border-radius: 4px;
border: 1px solid rgba(229, 229, 229, 1);
}
.title {
font-size: 24px;
font-weight: 500;
color: rgba(51, 51, 51, 1);
}
.form-label {
font-size: 15px;
color: rgb(92, 91, 91);
width: auto;
}
.form-item {
display: flex;
flex-direction: column;
/* height: 90px; */
padding: 5px 0;
}
.section {
display: flex;
background: rgba(255, 255, 255, 1);
border-radius: 4px;
flex-direction: column;
}
.tip {
font-size: 16px;
color: rgba(51, 51, 51, 1);
position: absolute;
right: 45px;
top: 10px;
}
.form-action {
display: flex;
justify-content: flex-end;
margin: 0 20px;
padding-top: 10px;
}
label {
/* width: auto; */
/* width: 200px; */
display: flex;
flex-direction: row;
align-items: center;
}
.label-box {
display: flex;
flex-direction: row;
align-items: center;
}
.dialog label input {
width: 20px !important;
height: 20px !important;
margin: 0 10px !important;
}
.cover {
width: 100%;
height: 100px;
background: rgba(247, 247, 247, 1);
border-radius: 4px;
border: 1px solid rgba(238, 238, 238, 1);
display: flex;
justify-content: center;
align-items: center;
}
.cover-img {
width: 300px;
cursor: pointer;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
height: 300px;
}
.icon-cover {
width: 34px;
height: 34px;
background-image: url("/static/images/icon_cover.png");
background-size: 100%;
background-repeat: no-repeat;
}
.section {
width: 100% !important;
display: flex;
flex-direction: column;
}
.rule-field tbody tr td:first-child {
padding-left: 5px !important;
height: auto !important;
}
tbody tr td {
font-size: 15px !important;
padding: 5px;
}
input[type=checkbox]::before {
border: none !important;
background: none !important;
}
input[type=checkbox]:checked::before {
border: none !important;
background: none !important;
}
input[type=checkbox] {
top: 0;
left: 0;
}
</style>
</head>
<body>
<jsp:include page="../common/header.jsp"></jsp:include>
<div class="page-content d-flex align-items-stretch main-body">
<jsp:include page="../common/menu.jsp"></jsp:include>
<div class="rght" id="module">
<div class="section">
<div class="flex flex-row items-center justify-between">
<h3 class="title">发票管理</h3>
<div class="flex flex-row items-center">
<div class="btn-toolbar flex justify-between" role="toolbar"
aria-label="Toolbar with button groups">
<div class="btn-group" role="group" aria-label="First group">
<button :class="[index==statusIndex?'btn-danger':'btn-default']"
@click="changeStatus(index)" type="button"
v-for="(statusOpt,index) in statusOptions" :key="index"
class="btn btn-sm">
{{statusOpt.name}}
</button>
</div>
</div>
<div class="btn-toolbar ml-2 flex justify-between" role="toolbar"
aria-label="Toolbar with button groups">
<div class="btn-group" role="group" aria-label="First group">
<button
:class="[index==invoiceTypeIndex?'btn-danger':'btn-default']"
@click="changeInvoice(index)" type="button"
v-for="(item,index) in invoiceTypes" :key="index"
class="btn btn-sm">
{{item.name}}
</button>
</div>
</div>
<div class="btn-toolbar ml-2 flex justify-between" role="toolbar"
aria-label="Toolbar with button groups">
<div class="btn-group" role="group" aria-label="First group">
<button :class="[index==paperTypeIndex?'btn-danger':'btn-default']"
@click="changePaper(index)" type="button"
v-for="(item,index) in paperTypes" :key="index"
class="btn btn-sm">
{{item.name}}
</button>
</div>
</div>
</div>
</div>
</div>
<div style="margin-top: -10px;margin-bottom: 50px">
<table style="width: 100%" class="rule-field">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:10%;">
<col style="width:15%;">
</colgroup>
<thead>
<tr>
<th style="text-align: left;padding-left:5px;">选手</th>
<th style="text-align: left">发票信息</th>
<th style="text-align: left">公司信息</th>
<th style="text-align: left">物流</th>
<th style="text-align: center">操作</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :data-id="item.id">
<td>
<div class="flex flex-col">
<span class="lh-1.2">
姓名: {{item.receiverName}}
</span>
<span class="lh-1.2">
参赛号:{{item.markNo}}
</span>
<span class="lh-1.2">
手机号:{{item.receiverPhone}}
</span>
<span class="lh-1.2">
收货地址:{{item.receiverAddress}}
</span>
</div>
</td>
<td class="name" style="text-align: left;">
<div class="flex flex-col">
<span class="lh-1.2">
发票金额:{{item.invoiceMoney}}
</span>
<span class="lh-1.2">
发票类型:{{invoiceEnum[item.invoiceType]}}
</span>
<span class="lh-1.2">
发票状态:{{statusEnum[item.status]}}
</span>
<span class="lh-1.2">
发票内容:{{item.invoiceContent}}
</span>
<span class="lh-1.2">
开票方式:{{paperEnum[item.invoicePaper]}}
</span>
</div>
</td>
<td style="text-align: left;">
<div class="flex flex-col">
<span class="lh-1.2">
发票抬头:{{item.invoiceTitle}}
</span>
<span class="lh-1.2">
纳税人识别号:{{item.taxPayerId}}
</span>
<span class="lh-1.2">
开户行:{{item.taxBank}}
</span>
<span class="lh-1.2">
开户行账号:{{item.taxBankAccount}}
</span>
</div>
</td>
<td class="name" style="text-align: left;">
<div class="flex flex-col">
<span class="lh-1.2">
物流单号 {{item.shippingNo}}
</span>
</div>
</td>
<td style="text-align: center">
<div class="action">
<div class="opt edit.opt" @click="showEdit(item)">
<span class="icon-edit"></span>
<span class="edit">
编辑
</span>
</div>
<div class="opt del" @click="delinvoice(item)">
<span class="icon-del"></span>
<span class="del">
删除
</span>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="dialog" v-show="dialog" style="width:40vw;height: 80vh; z-index: 99;display: flex;flex-direction: column;left: 50%;
transform: translateX(-50%);margin-left:0;">
<div>
<span class="title" style="margin-bottom: 10px; color: #CE3939">{{title}}</span>
</div>
<div style="display: flex;flex-direction: column;flex:1;overflow-y: auto;">
<!-- 发票类型 -->
<div class="form-item">
<span class="form-label">发票类型</span>
<div class="label-box">
<label>
<input type="radio" v-model="invoice.invoiceType" value="1"> 普通发票
</label>
<label>
<input type="radio" v-model="invoice.invoiceType" value="2"> 增值税专票
</label>
</div>
</div>
<!-- 开票方式 -->
<div class="form-item">
<span class="form-label">开票方式</span>
<div class="label-box">
<label>
<input type="radio" v-model="invoice.paperInvoice" value="0"> 电子发票
</label>
<label>
<input type="radio" v-model="invoice.paperInvoice" value="1"> 纸质发票
</label>
</div>
</div>
<!-- 开票金额 -->
<div class="form-item">
<div>
<span class="form-label">开票金额</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.amount"
placeholder="请输入开票金额">
</div>
</div>
<!-- 开票抬头 -->
<div class="form-item">
<div>
<span class="form-label">开票抬头</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.header"
placeholder="请输入开票抬头">
</div>
</div>
<!-- 增值税专票特有字段 -->
<div v-if="invoice.invoiceType == '2'">
<div class="form-item">
<div>
<span class="form-label">纳税人识别号</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.taxPayerId"
placeholder="请输入纳税人识别号">
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">开户行</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.taxBank"
placeholder="请输入开户行">
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">开户行账号</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.taxBankAccount"
placeholder="请输入开户行账号">
</div>
</div>
</div>
<!-- 电子发票邮箱 -->
<div class="form-item" v-if="invoice.paperInvoice == '0'">
<div>
<span class="form-label">电子发票邮箱</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.email"
placeholder="请输入接收电子发票的邮箱">
</div>
</div>
<!-- 纸质发票收件信息 -->
<div v-if="invoice.paperInvoice == '1'">
<div class="form-item">
<div>
<span class="form-label">收件人姓名</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.receiverName"
placeholder="请输入收件人姓名">
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">收件人电话</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.receiverPhone"
placeholder="请输入收件人电话">
</div>
</div>
<div class="form-item">
<div>
<span class="form-label">收件地址</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.receiverAddress"
placeholder="请输入收件地址">
</div>
</div>
</div>
<!-- 备注 -->
<div class="form-item">
<div>
<span class="form-label">备注</span>
</div>
<div>
<input class="input" type="text" v-model="invoice.remark"
placeholder="请输入备注信息">
</div>
</div>
</div>
<div class="form-action">
<span @click="cancel" class="cancel">取消</span>
<span @click="submit" class="submit">保存</span>
</div>
</div>
<div v-show="dialog"
style="position: fixed;height: 100%;width: 100%;background: black;z-index: 10;opacity: 0.5;top:0px;left:0px">
</div>
</div>
<script src="${ctxStatic}/vue/vue.js"></script>
<script>
const uploadUrl = '/api-common/v1/upload?folder=' + 'gk/module' + '&cmptId=' + getCId()
var app = new Vue({
el: '#module',
data: {
list: [],
dialog: false,
title: '发票管理',
// 发票方式
invoiceTypeIndex: 0,
invoiceTypes: [
{
name: "全部",
value: ''
},
{
name: "普通发票",
value: 1
},
{
name: "增值税发票",
value: 2
}
],
// 发票方式
paperTypeIndex: 0,
paperTypes: [
{
name: "全部",
value: ''
},
{
name: "电子发票",
value: 1
},
{
name: "纸质发票",
value: 2
}
],
statusIndex: 0,
statusOptions: [
{
name: "全部",
value: ''
},
{
name: "提交",
value: 1
},
{
name: "拒绝",
value: 2
}, {
name: "已开票",
value: 3
}
],
statusEnum: {
1: "提交",
2: "待处理",
},
invoiceEnum: {
1: "普通发票",
2: "增值税专票",
},
paperEnum: {
0: "电子发票",
1: "纸质发票",
},
invoice: {
cmptId: getCId(),
invoiceType: '1', // 1:普通发票 2:增值税专票
paperInvoice: '0', // 0:电子发票 1:纸质发票
amount: null,
header: null,
taxPayerId: null,
taxBank: null,
taxBankAccount: null,
email: null,
receiverName: null,
receiverPhone: null,
receiverAddress: null,
remark: null,
status: 1 // 1:提交
},
statusType: {
0: '关闭',
1: '开启'
}
},
methods: {
changeStatus(index) {
this.statusIndex = index;
this.fetchData()
},
changeInvoice(index) {
this.invoiceTypeIndex = index;
this.fetchData()
},
changePaper(index) {
this.paperTypeIndex = index;
this.fetchData()
},
changePage(page) {
this.page = page
this.fetchData()
},
next() {
this.page += 1
this.fetchData()
},
preview() {
this.page -= 1
this.fetchData()
},
// 重置表单
resetForm() {
this.invoice = {
cmptId: getCId(),
invoiceType: '1', // 1:普通发票 2:增值税专票
paperInvoice: '0', // 0:电子发票 1:纸质发票
amount: null,
header: null,
taxPayerId: null,
taxBank: null,
taxBankAccount: null,
email: null,
receiverName: null,
receiverPhone: null,
receiverAddress: null,
remark: null,
status: 1 // 1:提交
};
},
// 编辑
showEdit(detail) {
this.invoice = { ...detail };
this.dialog = true;
},
// 删除
delinvoice(data) {
layer.confirm("确认要删除吗?", function () {
$.ajax({
url: '/gk/invoice/delete?id=' + data.id,
type: 'get',
contentType: 'application/json',
beforeSend: () => {
layer.load()
},
success: () => {
layer.msg('删除成功!');
},
complete: () => {
layer.closeAll()
app.fetchData();
}
});
});
},
// 保存
submit() {
const invoice = { ...this.invoice }
const url = "/gk/invoice/update"
$.ajax({
url,
data: JSON.stringify(invoice), // 将 data 转换为 JSON 字符串
type: 'post',
contentType: 'application/json',
beforeSend: () => {
layer.load()
},
success: (res) => {
layer.msg(res.code == 1 ? '保存成功!' : res.msg);
this.dialog = false;
this.fetchData();
},
complete: () => {
layer.closeAll()
}
})
},
// 返回
cancel() {
this.dialog = false;
},
// 查询所有
fetchData() {
if (!getCId()) return
const url = '/gk/invoice/list?status=' + this.statusOptions[this.statusIndex].value + '&cmptId=' + getCId() + '&invoiceType=' + this.invoiceTypes[this.invoiceTypeIndex].value + '&paperInvoice=' + this.paperTypes[this.paperTypeIndex].value
$.ajax({
type: 'GET',
contentType: 'application/json',
url,
beforeSend: () => {
layer.load()
},
complete: () => {
layer.closeAll()
},
success: (data) => {
this.list = data.content
}
})
},
}
});
app.fetchData();
</script>
</body>
</html>
\ No newline at end of file
......@@ -656,7 +656,7 @@
return;
}
// 文档
if (file.type && !['.docx', '.xlsx', '.pptx'].includes(file.name.slice(file.name.lastIndexOf('.'))) && this.letter.openType == 5) {
if (file.type && !['.docx', '.xlsx', '.pptx', '.pdf'].includes(file.name.slice(file.name.lastIndexOf('.'))) && this.letter.openType == 5) {
layer.msg('请上传文档', { icon: 5 })
return;
}
......
......@@ -348,6 +348,20 @@
<span class="menu-txt">轮播图管理</span>
</a>
</li>
<li class="bag menu-sub-item">
<a
href="/gk/bag/index/${cmpt.cmptId}?uId=${uId}&cId=${cId}&timestamp=${timestamp}&sign=${sign}">
<span class="left-arrow"></span>
<span class="menu-txt">赛包邮寄</span>
</a>
</li>
<li class="invoice menu-sub-item">
<a
href="/gk/invoice/index/${cmpt.cmptId}?uId=${uId}&cId=${cId}&timestamp=${timestamp}&sign=${sign}">
<span class="left-arrow"></span>
<span class="menu-txt">发票管理</span>
</a>
</li>
</ul>
</li>
</ul>
......@@ -410,7 +424,7 @@
var classes = ['cmptSetting', 'nameList', 'manual', 'contact', 'manage',
'route', 'road', 'equip', 'photo', 'news', 'cert', 'data',
'banner', 'score', 'auto', 'scan', 'review', 'customer', 'rule',
'outter-link', 'sure-letter', 'rankSetting', 'service', "module", "swiper"];
'outter-link', 'sure-letter', 'rankSetting', 'service', "module", "swiper", "bag", "invoice"];
let url = document.location.href;
var done = false;
for (var i in classes) {
......
/* Flex 布局相关 */
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.flex-row {
flex-direction: row;
}
.justify-start {
justify-content: flex-start;
}
.justify-end {
justify-content: flex-end;
}
.justify-center {
justify-content: center;
}
.justify-between {
justify-content: space-between;
}
.justify-around {
justify-content: space-around;
}
.items-start {
align-items: flex-start;
}
.items-end {
align-items: flex-end;
}
.items-center {
align-items: center;
}
.items-baseline {
align-items: baseline;
}
.items-stretch {
align-items: stretch;
}
.flex-wrap {
flex-wrap: wrap;
}
.flex-nowrap {
flex-wrap: nowrap;
}
.flex-1 {
flex: 1 1 0%;
}
/* Margin 相关 */
.m-0 {
margin: 0;
}
.m-1 {
margin: 0.25rem;
}
.m-2 {
margin: 0.5rem;
}
.m-3 {
margin: 1rem;
}
.m-4 {
margin: 1.5rem;
}
.m-5 {
margin: 3rem;
}
.mt-0 {
margin-top: 0;
}
.mt-1 {
margin-top: 0.25rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.mt-3 {
margin-top: 1rem;
}
.mt-4 {
margin-top: 1.5rem;
}
.mt-5 {
margin-top: 3rem;
}
/* 其他方向margin (mr, mb, ml) 和 padding (p, pt, pr, pb, pl) 同理 */
/* 这里省略类似代码,实际使用时建议补全 */
/* Padding 相关 */
.p-0 {
padding: 0;
}
.p-1 {
padding: 0.25rem;
}
.p-2 {
padding: 0.5rem;
}
.p-3 {
padding: 1rem;
}
.p-4 {
padding: 1.5rem;
}
.p-5 {
padding: 3rem;
}
/* 文本相关 */
.text-left {
text-align: left;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.text-uppercase {
text-transform: uppercase;
}
.text-lowercase {
text-transform: lowercase;
}
.text-capitalize {
text-transform: capitalize;
}
.font-bold {
font-weight: bold;
}
.font-normal {
font-weight: normal;
}
/* 宽度相关 */
.w-full {
width: 100%;
}
.w-auto {
width: auto;
}
.w-1\/2 {
width: 50%;
}
.w-1\/3 {
width: 33.333333%;
}
.w-2\/3 {
width: 66.666667%;
}
/* 显示相关 */
.block {
display: block;
}
.inline-block {
display: inline-block;
}
.inline {
display: inline;
}
.hidden {
display: none;
}
/* 间距相关 - 基于rem单位 */
.gap-0 {
gap: 0;
}
.gap-1 {
gap: 0.25rem;
}
.gap-2 {
gap: 0.5rem;
}
.gap-3 {
gap: 1rem;
}
.gap-4 {
gap: 1.5rem;
}
.gap-5 {
gap: 3rem;
}
/* 行间距 (row-gap) */
.row-gap-0 {
row-gap: 0;
}
.row-gap-1 {
row-gap: 0.25rem;
}
.row-gap-2 {
row-gap: 0.5rem;
}
.row-gap-3 {
row-gap: 1rem;
}
.row-gap-4 {
row-gap: 1.5rem;
}
.row-gap-5 {
row-gap: 3rem;
}
/* 列间距 (column-gap) */
.column-gap-0 {
column-gap: 0;
}
.column-gap-1 {
column-gap: 0.25rem;
}
.column-gap-2 {
column-gap: 0.5rem;
}
.column-gap-3 {
column-gap: 1rem;
}
.column-gap-4 {
column-gap: 1.5rem;
}
.column-gap-5 {
column-gap: 3rem;
}
/* 行高相关 */
.lh-1 {
line-height: 1;
}
.lh-1\.2 {
line-height: 1.2;
}
.lh-1\.4 {
line-height: 1.4;
}
.lh-1\.5 {
line-height: 1.5;
}
.lh-1\.6 {
line-height: 1.6;
}
.lh-1\.8 {
line-height: 1.8;
}
.lh-2 {
line-height: 2;
}
/* 固定值行高 */
.lh-16 {
line-height: 16px;
}
.lh-20 {
line-height: 20px;
}
.lh-24 {
line-height: 24px;
}
.lh-28 {
line-height: 28px;
}
.lh-32 {
line-height: 32px;
}
.lh-40 {
line-height: 40px;
}
.lh-48 {
line-height: 48px;
}
/* 指针相关 */
.cursor-auto {
cursor: auto;
}
.cursor-default {
cursor: default;
}
.cursor-pointer {
cursor: pointer;
}
.cursor-wait {
cursor: wait;
}
.cursor-text {
cursor: text;
}
.cursor-move {
cursor: move;
}
.cursor-help {
cursor: help;
}
.cursor-not-allowed {
cursor: not-allowed;
}
.cursor-none {
cursor: none;
}
.cursor-context-menu {
cursor: context-menu;
}
.cursor-progress {
cursor: progress;
}
.cursor-cell {
cursor: cell;
}
.cursor-crosshair {
cursor: crosshair;
}
.cursor-vertical-text {
cursor: vertical-text;
}
.cursor-alias {
cursor: alias;
}
.cursor-copy {
cursor: copy;
}
.cursor-no-drop {
cursor: no-drop;
}
.cursor-grab {
cursor: grab;
}
.cursor-grabbing {
cursor: grabbing;
}
.cursor-all-scroll {
cursor: all-scroll;
}
.cursor-col-resize {
cursor: col-resize;
}
.cursor-row-resize {
cursor: row-resize;
}
.cursor-n-resize {
cursor: n-resize;
}
.cursor-e-resize {
cursor: e-resize;
}
.cursor-s-resize {
cursor: s-resize;
}
.cursor-w-resize {
cursor: w-resize;
}
.cursor-ne-resize {
cursor: ne-resize;
}
.cursor-nw-resize {
cursor: nw-resize;
}
.cursor-se-resize {
cursor: se-resize;
}
.cursor-sw-resize {
cursor: sw-resize;
}
.cursor-ew-resize {
cursor: ew-resize;
}
.cursor-ns-resize {
cursor: ns-resize;
}
.cursor-nesw-resize {
cursor: nesw-resize;
}
.cursor-nwse-resize {
cursor: nwse-resize;
}
.cursor-zoom-in {
cursor: zoom-in;
}
.cursor-zoom-out {
cursor: zoom-out;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment