This commit is contained in:
hant 2025-04-17 11:17:40 +08:00
parent a916c55786
commit 1ac760222c
11 changed files with 257 additions and 42 deletions

View File

@ -4,6 +4,7 @@ namespace app\admin\controller;
use app\admin\addresmart\Address;
use app\admin\model\AuthGroupAccess;
use app\admin\model\order\Invoice;
use app\admin\model\OrderDispatch;
use app\admin\model\Worker;
use app\admin\model\WorkerItem;
@ -92,7 +93,6 @@ class Order extends Backend
->field(['id', 'nickname'])
->select();
$this->view->assign("statusList", $this->model->getStatusList());
$this->view->assign("sources", $res);
$this->view->assign("coupons", $coupons);
$this->view->assign("items", $formattedTree);
@ -598,13 +598,8 @@ class Order extends Backend
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
$this->model->validateFailException()->validate($validate);
}
$result = $this->model->allowField(true)->save($params);
$params['invoice_method'] = 1;
$result = (new Invoice())->allowField(true)->save($params);
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();

View File

@ -1,9 +1,11 @@
<?php
namespace app\admin\controller\order;
namespace app\admin\controller\orders;
use app\admin\controller\order\Exception;
use app\common\controller\Backend;
use think\Db;
use think\exception\DbException;
use think\exception\PDOException;
use think\exception\ValidateException;
@ -14,7 +16,6 @@ use think\exception\ValidateException;
*/
class Invoice extends Backend
{
/**
* Invoice模型对象
* @var \app\admin\model\order\Invoice
@ -25,6 +26,7 @@ class Invoice extends Backend
{
parent::_initialize();
$this->model = new \app\admin\model\order\Invoice;
$this->view->assign("statusList", $this->model->getStatusList());
}
@ -71,4 +73,54 @@ class Invoice extends Backend
$this->success();
}
/**
* 编辑
*
* @param $ids
* @return string
* @throws DbException
* @throws \think\Exception
*/
public function edit($ids = null)
{
$row = $this->model->get($ids);
if (!$row) {
$this->error(__('No Results were found'));
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
$this->error(__('You have no permission'));
}
if (false === $this->request->isPost()) {
$order = model('order')->get($row['order_id']);
$this->view->assign('order', $order);
$this->view->assign('row', $row);
return $this->view->fetch();
}
$params = $this->request->post('row/a');
if (empty($params)) {
$this->error(__('Parameter %s can not be empty', ''));
}
$params = $this->preExcludeFields($params);
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
$row->validateFailException()->validate($validate);
}
$result = $row->allowField(true)->save($params);
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if (false === $result) {
$this->error(__('No rows were updated'));
}
$this->success();
}
}

View File

@ -27,8 +27,15 @@ class Invoice extends Model
protected $append = [
];
public function getStatusList()
{
return [
'0' => '代处理',
'1' => '已开票',
'2' => '已完成',
];
}

View File

@ -120,7 +120,7 @@
<label class="control-label col-xs-12 col-sm-3">{:__('Coupons')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-coupon" data-live-search="true" title="请选择" data-rule="required" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option {if $item['id'] == $row.coupon_id} selected {/if} selected value="0">不使用优惠</option>
<option {if $item['id'] == $row.coupon_id} selected {/if} value="0">不使用优惠</option>
{foreach $coupons as $item}
<option {if $item['id'] == $row.coupon_id} selected {/if} data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}

View File

@ -6,13 +6,13 @@
<input id="c-order_id" data-rule="required" disabled data-source="order/index" class="form-control" type="text" value="{$row.order_no}">
</div>
</div>
<input class="form-control" style="display: none" type="text" value="{$row.id}">
<input class="form-control" style="display: none" name="row[order_id]" type="text" value="{$row.id}">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">发票类型:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[invoice_type]" class="form-control">
<option value="1">公司发票</option>
<option selected value="1">公司发票</option>
<option value="2">个人发票</option>
</select>
</div>
@ -32,7 +32,7 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">金额:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-amount" data-rule="required" class="form-control" step="0.01" name="row[amount]" type="number">
<input id="c-amount" data-rule="required" class="form-control" step="0.01" name="row[amount]" value="{$row.total}" type="number">
</div>
</div>
<div class="form-group">

View File

@ -0,0 +1,101 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">订单编号:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-order_id" data-rule="required" disabled data-source="order/index" class="form-control" type="text" value="{$row.order_no}">
</div>
</div>
<input class="form-control" style="display: none" name="row[order_id]" type="text" value="{$row.id}">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">发票类型:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[invoice_type]" class="form-control">
<option selected value="1">公司发票</option>
<option value="2">个人发票</option>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">抬头/名字:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">纳税人识别号:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tax_number" class="form-control" name="row[tax_number]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">金额:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-amount" data-rule="required" class="form-control" step="0.01" name="row[amount]" value="{$row.total}" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">公司地址:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_address" class="form-control" name="row[company_address]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">公司电话:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_phone" class="form-control" name="row[company_phone]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">开户行:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-bank_name" class="form-control" name="row[bank_name]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">开户账号:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-bank_account" class="form-control" name="row[bank_account]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">接收邮箱:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-recipient_email" class="form-control" name="row[recipient_email]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">接收地址:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-recipient_address" class="form-control" name="row[recipient_address]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">接收名字:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-recipient_name" class="form-control" name="row[recipient_name]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">接收电话:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-recipient_phone" class="form-control" name="row[recipient_phone]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">备注:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-remark" class="form-control " rows="5" name="row[remark]" cols="50"></textarea>
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>

View File

@ -3,13 +3,16 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Order_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-order_id" data-rule="required" data-source="order/index" class="form-control selectpage" name="row[order_id]" type="text" value="{$row.order_id|htmlentities}">
<input id="c-order_id" data-rule="required" data-source="order/index" class="form-control" disabled type="text" value="{$order.order_no|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Invoice_type')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-invoice_type" data-rule="required" class="form-control" name="row[invoice_type]" type="number" value="{$row.invoice_type|htmlentities}">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[invoice_type]" class="form-control">
<option {if 1 == $row.invoice_type} selected {/if} value="1">公司发票</option>
<option {if 2 == $row.invoice_type} selected {/if} value="2">个人发票</option>
</select>
</div>
</div>
<div class="form-group">
@ -93,7 +96,11 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-status" class="form-control" name="row[status]" type="number" value="{$row.status|htmlentities}">
<select id="c-status" data-live-search="true" title="请选择" data-rule="required" name="row[status]" class="form-control">
<option {if 0 == $row.status} selected {/if} value="1">待处理</option>
<option {if 1 == $row.status} selected {/if} value="2">已开票</option>
<option {if 2 == $row.status} selected {/if} value="2">已完成</option>
</select>
</div>
</div>
<div class="form-group">
@ -102,18 +109,7 @@
<textarea id="c-remark" class="form-control " rows="5" name="row[remark]" cols="50">{$row.remark|htmlentities}</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-created_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[created_at]" type="text" value="{$row.created_at}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Updated_at')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-updated_at" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[updated_at]" type="text" value="{$row.updated_at}">
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">

View File

@ -7,7 +7,7 @@
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('order.invoice/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
<!-- <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('order.invoice/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>-->
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('order.invoice/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('order.invoice/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>

View File

@ -21,6 +21,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
Toastr.info('复制成功');
}
// 拼装文本
function assembleOrderMessage(data) {
const message = `
@ -407,6 +408,35 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
console.log('delete');
Form.api.bindevent($("form[role=form]"));
},
invoice: function () {
function toggleInvoiceFields() {
const type = $('#c-source').val();
console.log(type);
if (type === '1') {
// 公司发票
$('#c-tax_number').closest('.form-group').show();
$('#c-company_address').closest('.form-group').show();
$('#c-company_phone').closest('.form-group').show();
$('#c-bank_name').closest('.form-group').show();
$('#c-bank_account').closest('.form-group').show();
} else {
// 个人发票
$('#c-tax_number').closest('.form-group').hide();
$('#c-company_address').closest('.form-group').hide();
$('#c-company_phone').closest('.form-group').hide();
$('#c-bank_name').closest('.form-group').hide();
$('#c-bank_account').closest('.form-group').hide();
}
}
// 初始化时执行一次
toggleInvoiceFields();
// 监听 select 改变
$('#c-source').on('change',function () {
toggleInvoiceFields();
});
Form.api.bindevent($("form[role=form]"));
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));

View File

@ -5,12 +5,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'order.invoice/index' + location.search,
add_url: 'order.invoice/add',
edit_url: 'order.invoice/edit',
del_url: 'order.invoice/del',
multi_url: 'order.invoice/multi',
import_url: 'order.invoice/import',
index_url: 'orders.invoice/index' + location.search,
add_url: 'orders.invoice/add',
edit_url: 'orders.invoice/edit',
del_url: 'orders.invoice/del',
multi_url: 'orders.invoice/multi',
import_url: 'orders.invoice/import',
table: 'order_invoice',
}
});
@ -29,11 +29,22 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'order_id', title: __('Order_id')},
{field: 'invoice_type', title: __('Invoice_type')},
{field: 'invoice_type', title: __('Invoice_type'),formatter: function (val) {
return val === 1 ? '公司发票': '个人发票';
}},
{field: 'status', title: __('Status'),formatter:function (val) {
let list = [
'代处理',
'已开票',
'已完成',
];
return list[val] ?? '';
}},
{field: 'title', title: __('Title'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'tax_number', title: __('Tax_number'), operate: 'LIKE'},
{field: 'amount', title: __('Amount'), operate:'BETWEEN'},
{field: 'invoice_method', title: __('Invoice_method')},
// {field: 'invoice_method', title: __('Invoice_method')},
{field: 'recipient_email', title: __('Recipient_email'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'company_address', title: __('Company_address'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'company_phone', title: __('Company_phone'), operate: 'LIKE'},
@ -43,9 +54,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
{field: 'recipient_name', title: __('Recipient_name'), operate: 'LIKE'},
{field: 'recipient_phone', title: __('Recipient_phone'), operate: 'LIKE'},
{field: 'issued_at', title: __('Issued_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'status', title: __('Status')},
{field: 'created_at', title: __('Created_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'updated_at', title: __('Updated_at'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
@ -58,6 +67,31 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
Controller.api.bindevent();
},
edit: function () {
function toggleInvoiceFields() {
const type = $('#c-source').val();
if (type === '1') {
// 公司发票
$('#c-tax_number').closest('.form-group').show();
$('#c-company_address').closest('.form-group').show();
$('#c-company_phone').closest('.form-group').show();
$('#c-bank_name').closest('.form-group').show();
$('#c-bank_account').closest('.form-group').show();
} else {
// 个人发票
$('#c-tax_number').closest('.form-group').hide();
$('#c-company_address').closest('.form-group').hide();
$('#c-company_phone').closest('.form-group').hide();
$('#c-bank_name').closest('.form-group').hide();
$('#c-bank_account').closest('.form-group').hide();
}
}
// 初始化时执行一次
toggleInvoiceFields();
// 监听 select 改变
$('#c-source').on('change',function () {
toggleInvoiceFields();
});
Controller.api.bindevent();
},
api: {